Verschachtelte Arrays in MongoDB über Mongo-Shell aktualisieren

Es folgt ein MongoDB-Dokument:

{ "_id" : 2, "mem_id" : M002, "email" : "xyz@gmail.com", "event_type" : [ { "name" : "MT", "count" : 1, "language" : [ { "name" : "English", "count" : 1, "genre" : [ { "name" : "Action", "count" : 6 }, { "name" : "Sci-Fi", "count" : 3 } ], "cast" : [ { "name" : "Sam Wortington", "count" : 2 }, { "name" : "Bruce Willis", "count" : 4 }, { "name" : "Will Smith", "count" : 7 }, { "name" : "Irfan Khan", "count" : 1 } ] } ] } ] } 

Ich bin nicht in der Lage, Felder zu aktualisieren, die vom Typ Array sind, insbesondere event_type, Sprache, Genre und Cast aufgrund der Verschachtelung. Grundsätzlich wollte ich alle vier genannten Felder zusammen mit dem Zählfeld für jedes Filialdokument aktualisieren. Die update-statement sollte einen Wert in die Struktur einfügen, wenn der Wert neu ist. Else sollte die Anzahl für diesen Wert erhöhen.
Was kann die Abfrage in der Mongo Shell sein? Vielen Dank

Sie treffen direkt eine der aktuellen Einschränkungen von MongoDB. Das Problem besteht darin, dass die Engine mehrere Positionsoperatoren nicht unterstützt. Siehe hierzu Mehrfachnutzung des positionellen Operators `$` zum Aktualisieren verschachtelter Arrays

Dafür gibt es ein offenes Ticket: https://jira.mongodb.org/browse/SERVER-831 (auch dort erwähnt)

Sie können dieses auch lesen, wie Sie Ihr Datenmodell ändern können: Verschachtelte Arrays in mongodb aktualisieren

Wenn es für Sie machbar ist, können Sie Folgendes tun:

 db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.0.language.$.count":}}) db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.$.language.0.count":}}) 

Aber du kannst nicht:

 db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.$.language.$.count":}}) 

Lassen Sie uns von Fall zu Fall gehen:

  1. So aktualisieren Sie den Feldnamen im Array event_type:

    db.testnested.update ({“event_type.name”: “MT”}, {$ set: {“event_type.name”: “GMT”}})

Dieser Befehl aktualisiert den Namen für ein Objekt in der Liste event_type von MT in GMT:

 BEFORE: db.testnested.find({}, {"event_type.name" : 1}) { "_id" : 2, "event_type" : [ { "name" : "MT" } ] } AFTER: db.testnested.find({}, {"event_type.name" : 1}) { "_id" : 2, "event_type" : [ { "name" : "GMT" } ] } 

2.Um Felder innerhalb von event_type zu aktualisieren, z. B. Sprache, Genre, die eine interne Liste sind: Es gibt keine direkte Abfrage dafür. Sie müssen das Dokument lesen, dieses Dokument mit dem JavaScript oder der Sprache Ihrer Wahl aktualisieren und dann save () speichern. Ich denke nicht, dass es einen anderen Weg bis Mongo 2.4 gibt

Weitere Informationen finden Sie unter save () .

Vielen Dank!