it-swarm.dev

mongodb-Positionsfehler

Ich habe solche Objekte

{
    "_id" : ObjectId("5742be02289512cf98bf63e3"),
    "name" : "test1",
    "name" : "test1",
    "attributes" : [ 
        {
            "name" : "x",
            "color" : "0xd79c9c",
            "_id" : ObjectId("5742be02289512cf98bf63e8")
        }, 
        {
            "name" : "y",
            "color" : "0xd79c9c",
            "_id" : ObjectId("5742be02289512cf98bf63e7")
        }, 
        {
            "name" : "z",
            "color" : "0xd79c9c",
            "_id" : ObjectId("5742be02289512cf98bf63e6")
        }
    ],
    "__v" : 6
}

Und ich möchte alle Dokumente aktualisieren und für jedes Attribut ein neues Feld festlegen. Ich möchte also eine einzelne Abfrage ausführen, um alle Dokumente auf einmal zu aktualisieren. Ich denke, diese Abfrage wird es tun 

db.spaces.update({}, { $set: { "attributes.0.weight": 2 } }, {multi: true})

Wenn ich diese Abfrage starte, erhalte ich eine Fehlermeldung.

"Code": 16837
"errmsg": "Der Positionsoperator hat die erforderliche - Abfrage nicht gefunden. Unerwartetes Update: Attribute. $. weight"

Also kann ich nicht verstehen warum. Bitte helfen Sie

8
Gor

Sie müssen das Array-Feld als Teil des Abfragedokuments einschließen, um daspositional operatorverwenden zu können.

Wenn Sie zum Beispiel das erste Array-Element aktualisieren möchten, d. H. Mit { "attributes.name": "x" }, können Sie dem Muster folgen:

db.spaces.update(
   { "attributes.name": "x" }, // <-- the array field must appear as part of the query document.
   { "$set": { "attributes.$.weight": 2 } },
   { "multi": true }
)

Für die neueren MongoDB-Versionen 3.2.X können Sie die MethodeupdateMany()verwenden, um mehrere Dokumente innerhalb der Sammlung basierend auf dem oben genannten Filter zu aktualisieren.

16
chridam

Der Positionsoperator benötigt eine Übereinstimmung aus dem Übereinstimmungsbereich Ihrer Aktualisierungsabfrage.

zum Beispiel:

db.spaces.update({ "attributes.name": "x" }, { $set: { "attributes.0.weight": 2 } }, {multi: true})

hier stimmt der erste Parameter für die Aktualisierungsoperation mit dem Array attributes überein, wobei jedes Element eine Eigenschaft name=="x" hat. Für jedes Element, das der Bedingung entspricht, kann der Positionsoperator zum Aktualisieren verwendet werden.

Da name='x' in diesem Fall das erste übereinstimmende Element wäre,

{
            "name" : "x",
            "color" : "0xd79c9c",
            "_id" : ObjectId("5742be02289512cf98bf63e8")
        }, 

und es wird aktualisiert.

Nun, aus Ihrer Frage, die Sie verstehen, möchten Sie das Dokument so aktualisieren, dass in jedem Dokument Ihr erstes Element, attribute, einen neuen Wert für weight=2 erhält.

du kannst sowas machen

db.spaces.update({ "attributes.name": { $regex: /^(?=[\S\s]{10,8000})[\S\s]*$/ } }, { $set: { "attributes.0.weight": 2 } }, {multi: true})

Was wir hier tun, ist, dass alle Elemente im Array-Attribut übereinstimmen. und wir verwenden den Positionsoperator, um das erste Element dieses Arrays zu aktualisieren

2
Naeem Shaikh