web-dev-qa-db-fra.com

Mongoose supprimer (tirer) un document dans un tableau, ne fonctionne pas avec ObjectID

J'ai le schéma suivant pour la mangouste:

user = {
    "userId" : "myId",
    "connections":
    [{
        "dateConnectedUnix": 1334567891,
        "isActive": true
    }, {
        "dateConnectedUnix": 1334567893,
        "isActive": false
    }]
}

J'aimerais supprimer le deuxième élément du tableau connections pour obtenir les éléments suivants:

user = {
    "userId" : "myId",
    "connections": 
    [{
        "dateConnectedUnix": 1334567893,
        "isActive": false
    }]
}

Le code suivant fait le travail comme prévu:

userAccounts.update({'connections.isActive': false }, 
                    {$pull: { 'connections.isActive':false }}, 
                    function (err,val) {
                        console.log(val)
                    });

Mais, je dois supprimer basé sur ObjectId. Et ce qui suit ne fonctionne pas:

userAccounts.update({'connections._id': '1234-someId-6789' }, 
                    {$pull: { 'connections._id': '1234-someId-6789' }}, 
                    function (err,val) {
                        console.log(val)
                    });

Aucune suggestion? Je frappe ma tête contre l'écran (alias Google, Stackoverflow, ...) depuis des heures et je n'ai pas eu de chance.

23
psiphi75

Il semble que le code ci-dessus ne fonctionnerait pas. Cela n'aurait même pas dû fonctionner pour le premier exemple que j'ai donné.

En fin de compte, cette réponse m'a conforté dans ma réponse: MongoDB, remove object from array

Voici mon code de travail:

userAccounts.update( 
      { userId: usr.userId },
      { $pull: { connections : { _id : connId } } },
      { safe: true },
      function removeConnectionsCB(err, obj) {
          ...
      });
34
psiphi75

J'ai un document comme

 enter image description here

Je dois supprimer l'adresse du tableau d'adresses

Après avoir cherché beaucoup sur internet, j'ai trouvé la solution

 Customer.findOneAndUpdate(query, {$pull: {address: addressId}}, function(err, data){
        if(err) {
          return res.status(500).json({'error' : 'error in deleting address'});
        }

        res.json(data);

      });
14
Deepak Sisodiya

Pour utiliser update avec ObjectId, vous devez utiliser un objet ObjectId au lieu d'une représentation sous forme de chaîne:

var ObjectId = require('mongoose').Types.ObjectId;

userAccounts.update({'connections._id': new ObjectId('1234-someId-6789') }, 
                {$pull: { 'connections._id': new ObjectId('1234-someId-6789') }}, 
                function (err,val) {
                    console.log(val)
                });
8
throrin19

mangouste: 4.11.11
Ce qui a fonctionné pour moi est la syntaxe suivante:

const removeTansactionFromUser = (userId, connectionId) => {
    return User.findByIdAndUpdate(userId, { $pull: { "connections": connectionId} }, {'new': true} );
};

Mongoose support id au format chaîne ou au format ObjectId.
Astuce: new ObjectId(stringId) pour passer de chaîne à ObjectId

1
chenop
user: {
 _id: ObjectId('5ccf3fa47a8f8b12b0dce204'),
 name: 'Test',
 posts: [
  ObjectId("5cd07ee05c08f51af8d23b64"),
  ObjectId("5cd07ee05c08f51af8d23c52")
 ]
}

Supprimer un seul post du tableau posts

user.posts.pull("5cd07ee05c08f51af8d23b64"); user.save();

0
user9457226

Vous pouvez le faire dansmongoose 5.4.x

const result = await User.findByIdAndUpdate(user_id,
            {
                $pull: {
                    connections: { _id: con_id }
                }
            }, { new: true });


if (result)
    console.log(result)

Le tableau item from connections sera supprimé en fonction de la propriété fournie _id valeur

0
WasiF