2016-04-09 15 views
0

Meine Schemastruktur etwas wie folgt aussieht:Wie ein mongodb Objekt mit mehreren Auswahlkriterien aktualisieren

{ 
    "__v":0, 
    "_id":ObjectId("5708423e897db8255aaaa9dd"), 
    "podId":169400000005, 
    "env":[ 
    { 
     "type":"1", 
     "id":3852000000035, 
     "_id":ObjectId("5708423e897db8255aaaa9de") 
    }, 
    { 
     "type":"2", 
     "id":3852000000040, 
     "_id":ObjectId("5708423e897db8255aaaa9df") 
    } 
    ], 
    "name":"Test Build", 
    "parameters":[ 
    { 
     "name":"sound.left", 
     "type":"1", 
     "paramName":"Left Sound Control", 
     "paramType":"booleanParameter", 
     "testValue":null, 
     "liveValue":null, 
     "_id":ObjectId("5708423f897db8255aaaaa0d") 
    }, 
    { 
     "name":"sound.right", 
     "type":"1", 
     "paramName":"Right Sound Control", 
     "paramType":"booleanParameter", 
     "testValue":null, 
     "liveValue":null, 
     "_id":ObjectId("5708423f897db8255aaaaa0d") 
    }, 
    ... 
    ] 
} 

Ich habe 3 bekannte Variablen: podId für podId, codeName für parameters.name, envType für parameters.type. Mit ihnen möchte ich das Objekt unter Verwendung podId, codeName und envType, mit einer neuen Variablen paramValue, die den testValue Wert enthält, aktualisieren.

Was ich versucht habe

db.pods.update({ 
    podId: podId, 
    parameters: { 
     $elemMatch: { 
      name: codeName, 
      type: envType 
     } 
    } 
}, { 
    $set: { 
     'parameters.$.testValue': paramValue 
    } 
}); 

Ich versuche, die testValue wo podId == podId, parameters.name == codeName und parameters.type == envType, aber die oben aktualisieren nichts zu aktualisieren.

Ich habe auch versucht

db.pods.update({ 
    podId: podId, 
    parameters: { 
     name: codeName, 
     type: envType 
    } 
}, { 
    $push: { 
     parameters: { 
      testValue: paramValue 
     } 
    } 
}, 
    function(err) { 
     if(err) throw err; 
    }); 

im Grunde nehmen, was das Objekt zu bauen gearbeitet, wenn ich nur die podId vergleichen musste, und das Hinzufügen der zusätzlichen Kriterien; Es hat diesmal nicht funktioniert.

bearbeiten: fixed Schematyp Nummer String

+0

'parameter.type' ist eine Zeichenkette. Sind Sie sicher, dass Sie in einer Zeichenkette und nicht in einer Ganzzahl übereinstimmen? d. h. "envType" '1' oder" 1 "'? – BanksySan

+0

Whoops Ich tippte es falsch in meine Frage ein. 'env.type',' parameters.type' und 'envType' sind alle Zeichenfolgen. Ich habe den Beitrag aktualisiert, um das zu berücksichtigen. – sengakae

Antwort

0

diese Lassen Sie Variablen, die Sie in Mongo Shell haben:

> var podId = 169400000005 
> var codeName = "sound.right" 
> var envType = "1" 
> var paramValue = "updatedParamValue" 

Diese Abfrage können Sie versuchen:

db.test.update({"podId":podId, "parameters.name" : codeName, "parameters.type" : envType}, {$set : {"parameters.0.testValue" : paramValue,"parameters.1.testValue" : paramValue}}) 

Je Auf welchen testValue Sie aktualisieren möchten, können Sie den Index an diesen übergeben. Aktualisieren

Nach Ergebnis erhalte ich nach der Update-Abfrage:

db.test.find().pretty() 

{ "_id": ObjectId ("570c850ab9477f18ac5297f9"), "__v": 0, "Pod-ID" : 169400000005, "env": [{ "type": "1" "id": 3852000000035, "_id": ObjectId ("5708423e897db8255aa aa9de ") }, { "type": "2", "id": 3852000000040, "_id": ObjectId (" 5708423e897db8255aaaa9df ") } ], "name": "Test Build", "Parameter": [ { "Name": "Ton.links“, "type": "1", "paramName": "Left Sound Control", "ParamTyp": "BooleanParameter", "Testvalue": "updatedParamValue", "liveValue": null, "_id": ObjectId ("5708423f897db8255aaaaa0d") }, { "name": "sound.right", "type": "1", "paramName": "Right Sound Control", „ParamTyp ":" booleanParameter ", " testValue ":" updatedParamValue ", " LiveVal ue“: null, "_id": ObjectId ("5708423f897db8255aaaaa0d") } ] }

Dank.

+0

In diesem Schema gibt es mehrere Pods, und das Parameterarray enthält bis zu tausend Parameterobjekte. Ich möchte nur den 'testValue' von bestimmten Objekten aktualisieren, wo' podId', 'parameters.name' und' parameters.type' übereinstimmen. – sengakae

+0

Also funktioniert die Abfrage, die ich vorgeschlagen habe, nicht? Ich habe die Abfrage geschrieben, wobei ich dieses Ding im Hinterkopf behalten habe. –

+0

Ja, der 'testValue' ist immer noch null. – sengakae