4 Stimmen

MongoDB: Das Aktualisieren einer Eigenschaft eines Unterarrays aktualisiert nur das erste Element

Das übereinstimmende Element sieht so aus:

{
    "_id": {
        "$oid": "519ebd1cef1fce06f90e3157"
    },
    "from": "Tester2",
    "to": "Tester",
    "messages": [
        {
            "username": "Tester2",
            "message": "heeey",
            "read": false
        },
        {
            "username": "Tester",
            "message": "hi!",
            "read": false
        },
        {
            "username": "Tester2",
            "message": "test",
            "read": false
        }
    ],
}

Jetzt versuche ich, das read-Attribut auf das aktuelle Datum nur bei den Teillementen zu setzen, bei denen der Benutzername ungleich Tester ist:

var messages = db.collection('messages');
messages.update(
{
    _id: new BSON.ObjectID("519ebd1cef1fce06f90e3157"),
    messages: {
        $elemMatch: { username: { $ne: "Tester" } }
    }
},
{ $set: { 'messages.$.read': new Date() } },
{ multi: true }, function(error, result) {
    console.log(error);
    console.log(result);
});

Aber nur das erste Teillement der Nachrichten wird aktualisiert:

{
    "_id": {
        "$oid": "519ebd1cef1fce06f90e3157"
    },
    "from": "Tester2",
    "to": "Tester",
    "messages": [
        {
            "username": "Tester2",
            "message": "heeey",
            "read":  {
                "$date": "2013-01-01T00:00:00.000Z"
            }
        },
        {
            "username": "Tester",
            "message": "hi!",
            "read": false
        },
        {
            "username": "Tester2",
            "message": "test",
            "read": false
        }
    ],
}

Was ist falsch mit dem Code? Ich verwende node.js v0.10.8 und MongoDB v2.4.3 zusammen mit node-mongodb-native.

15voto

JohnnyHK Punkte 289697

Es ist nichts falsch an Ihrem Code; der $ Operator enthält den Index des ersten übereinstimmenden Array-Elements. Die Option {multi: true} bewirkt nur, dass das update auf mehrere Dokumente angewendet wird, nicht auf Array-Elemente. Um mehrere Array-Elemente in einem einzigen update zu aktualisieren, müssen Sie sie durch numerischen Index angeben.

Also müssten Sie etwas wie dieses tun:

messages.update(    
    {
        _id: new BSON.ObjectID("519ebd1cef1fce06f90e3157")
    },
    { $set: { 
        'messages.0.read': new Date(),
        'messages.2.read': new Date()
    } },
    function (err, result) { ... }
);

1voto

Zaheer Punkte 2674

Dies ähnelt der Frage: Wie aktualisiere ich mehrere Array-Elemente in mongodb

var set = {}, i, l;
for(i=0,l=messages.length;i

1voto

Dragos Petcu Punkte 119

Ich weiß, es ist ein wenig spät, diese Frage zu beantworten, aber wenn Sie den $[]-Operator verwenden, wird es funktionieren.

  • mehr Details hier https://www.mongodb.com/docs/manual/reference/operator/update/positional-all/
  • Ich konnte es in einer updateMany-Operation verwenden, aber es sollte auch für update funktionieren

    var messages = db.collection('messages'); messages.update( { _id: new BSON.ObjectID("519ebd1cef1fce06f90e3157"), messages: { $elemMatch: { username: { $ne: "Tester" } } } }, { $set: { 'messages.$[].read': new Date() } }, { multi: true }, function(error, result) { console.log(error); console.log(result); });

0voto

tim Punkte 303

Ich denke, ArrayFilters können in diesem Fall verwendet werden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X