2016-06-03 24 views
5

ho oggetti come questoMongoDB errore dell'operatore posizionale

{ 
    "_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 
} 

E voglio aggiornare tutti i documenti, e impostare per ogni attributo nuovo campo. Quindi voglio eseguire una singola query per aggiornare tutti i documenti contemporaneamente. Penso che questa query lo farà

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

Ma quando eseguo questa query, ottengo un errore.

"codice": 16837,
"errmsg": "L'operatore posizionale non ha trovato il match necessaria dalla query di aggiornamento non espanso:. Attributi $ peso.".

Così ho non capisco perché Si prega di aiutare

+0

È necessario includere il campo dell'array come parte del documento di query per poter utilizzare l'operatore posizionale. – chridam

+0

@chridam, come posso farlo? – Gor

risposta

9

È necessario includere il campo matrice come parte del documento interrogazione al fine di utilizzare il positional operator.

Ad esempio, se si desidera aggiornare il primo elemento dell'array, cioè con { "attributes.name": "x" } allora si potrebbe seguire il modello:

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

Per le versioni più recenti MongoDB 3.2.X, è possibile utilizzare il metodo updateMany() aggiornare più documenti all'interno della raccolta in base al filtro sopra.

+2

db.spaces.update ({"attributes.name": {$ exists: true}}, {$ set: {"attributi. $.peso ": 3}}, {multi: true}) questa query aggiorna solo il primo elemento nell'array – Gor

+0

Ho bisogno di aggiornare tutti gli elementi nell'array per tutti i documenti – Gor

+0

@Gor Oh vedo, mi permetta di aggiornare la risposta – chridam

1

L'operatore di posizione ha bisogno di una corrispondenza, dalla parte di corrispondenza della query di aggiornamento.

ad esempio:

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

qui il primo parametro lavorazione aggiornamento corrisponderà dell'array attributes cui ogni elemento ha una proprietà name=="x", per qualsiasi eleent che corrisponde alla condizione l'operatore posizione può essere utilizzato per aggiornare .

Quindi, perché name='x', in questo caso il primo elemento corrispondente sarebbe,

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

e viene aggiornata.

Ora dalla tua domanda Capisco che desideri aggiornare il documento in modo che in ogni documento il tuo primo elemento, attribute, ottenga un nuovo valore per weight=2.

si può fare qualcosa di simile a

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

Quello che facciamo qui è tutto corrisponde elemento di attributo array. e usiamo l'operatore posizionale per aggiornare il primo elemento di quell'array

+0

questo aggiorna solo il primo elemento nell'array – Gor

+0

si ... l'operatore di posizione ' $ 'e' 0' aggiornerebbero solo il primo elemento. –

+0

Aggiornerò la mia risposta –

Problemi correlati