it-swarm.com.de

Wenn Sie ein Dokument innerhalb eines Arrays löschen (ziehen), funktioniert es nicht mit ObjectID

Ich habe das folgende Mungo-Schema:

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

Ich möchte das zweite Element im connections-Array löschen, um Folgendes zu erhalten:

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

Der folgende Code führt den Job wie erwartet aus:

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

Aber ich muss basierend auf ObjectId löschen. Und folgendes geht nicht:

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

Irgendwelche Vorschläge? Ich habe meinen Kopf stundenlang gegen den Bildschirm gekämpft (aka Google, Stackoverflow, ...) und hatte kein Glück.

23
psiphi75

Es scheint, dass der obige Code nicht funktionieren würde. Für das erste Beispiel, das ich gegeben habe, hätte es nicht einmal funktionieren sollen.

Am Ende wurde ich von dieser Antwort hier unterstützt: MongoDB, Objekt aus Array entfernen

Hier ist mein Arbeitscode:

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

Ich habe ein Dokument wie

 enter image description here

Ich muss die Adresse aus dem Adressfeld löschen

Nachdem ich viel im Internet gesucht hatte, fand ich die Lösung

 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

Um update mit ObjectId zu verwenden, sollten Sie das ObjectId-Objekt anstelle der String-Darstellung verwenden:

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

mungo: 4.11.11
Was für mich funktioniert hat, ist folgende Syntax:

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

Mongoose-Unterstützungs-ID im String-Format oder ObjectId-Format.
Tipp: new ObjectId(stringId), um von String zu ObjectId zu wechseln

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

Entfernen Sie einen einzelnen Beitrag aus dem Beitragsarray

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

0
user9457226

Sie können es inmongoose 5.4.x

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


if (result)
    console.log(result)

Das item von connections-Array wird basierend auf dem angegebenen Eigenschaftswert _id entfernt

0
WasiF