2011-09-15 14 views
9

Ho la seguente struttura nel mio documento:Come aggiornare il valore di un documento incorporato specifico, all'interno di un array, di un documento specifico in MongoDB?

{ 
    _id : ObjectId("43jh4j343j4j"), 
    array : [ 
      { 
       _arrayId : ObjectId("dsd87dsa9d87s9d7"), 
       someField : "something", 
       someField2 : "something2" 
      }, 
      { 
       _arrayId : ObjectId("sds9a0d9da0d9sa0"), 
       someField : "somethingElse", 
       someField2 : "somethingElse2" 
      } 
    ] 
} 

voglio aggiornare SomeField e someField2 ma solo per uno degli elementi della serie, quello che corrisponde _arrayId (ad esempio _arrayId : ObjectId("dsd87dsa9d87s9d7") , e solo per questo documento (ad esempio _id : ObjectId("43jh4j343j4j")) e nessun altro

I arrayIds non sono univoci al documento è per questo che ho bisogno di essere per un documento specifico. ument. Potrei usare lo $ positional operator se volessi aggiornare quel valore all'interno della matrice per ogni documento in cui esiste, ma non è quello che voglio.

Sto cercando di farlo in ma una soluzione da riga di comando potrebbe funzionare.

risposta

13

È ancora possibile utilizzare l'operatore $ positional per eseguire questa operazione. Ma è necessario specificare l'objectid del documento padre insieme al filtro _arrayid. La query da riga di comando di seguito funziona bene

db.so.update({_id:ObjectId("4e719eb07f1d878c5cf7333c"), 
       "array._arrayId":ObjectId("dsd87dsa9d87s9d7")}, 
       {$set:{"array.$.someField":"updated"}}) 
+0

funziona benissimo! Grazie. Quindi la query in 'coll.update (query, data)' funziona come un filtro per trovare il documento che stai cercando e come selettore per la parte del documento che ti interessa? – rjgonzo

+0

sì esattamente .. contento che abbia aiutato .. – RameshVel

17

Qui è la soluzione di RameshVel tradotto a :

DB db = conn.getDB("yourDB"); 
    DBCollection coll = db.getCollection("yourCollection"); 

    ObjectId _id = new ObjectId("4e71b07ff391f2b283be2f95"); 
    ObjectId arrayId = new ObjectId("4e639a918dca838d4575979c"); 

    BasicDBObject query = new BasicDBObject(); 
    query.put("_id", _id); 
    query.put("array._arrayId", arrayId); 

    BasicDBObject data = new BasicDBObject(); 
    data.put("array.$.someField", "updated"); 

    BasicDBObject command = new BasicDBObject(); 
    command.put("$set", data); 

    coll.update(query, command); 
+0

Grazie mille ho cercato una risposta per due ore ... –

+0

E se avessimo un altro livello di array creando anche un campo su un campo? Possiamo scrivere qualcosa come data.put ("array. $. SomeField. $. AnotherField", "updated"); Non funziona per me – Manish

+0

Grazie, risolto il mio problema. array. $. field era il trucco (sto usando 3.5) – Gilian

Problemi correlati