Domanda MongoDB: Come posso aggiornare un singolo sottoelemento in un array, a cui fa riferimento l'indice all'interno dell'array?


Sto cercando di aggiornare un singolo sottoelemento contenuto all'interno di un array in un documento mongodb. Voglio fare riferimento al campo usando il suo indice di array (gli elementi all'interno dell'array non hanno campi che posso garantire saranno identificatori univoci). Sembra che questo dovrebbe essere facile da fare, ma non riesco a capire la sintassi.

Ecco cosa voglio fare in pseudo-json.

Prima:

{
  _id : ...,
  other_stuff ... ,
  my_array : [
    { ... old content A ... },
    { ... old content B ... },
    { ... old content C ... }
  ]
}

Dopo:

{
  _id : ...,
  other_stuff ... ,
  my_array : [
    { ... old content A ... },
    { ... NEW content B ... },
    { ... old content C ... }
  ]
}

Sembra che la query dovrebbe essere qualcosa del genere:

//pseudocode
db.my_collection.update(
  {_id: ObjectId(document_id), my_array.1 : 1 },
  {my_array.$.content: NEW content B }
)

Ma questo non funziona. Ho passato troppo tempo a cercare i documenti di mongodb e ho provato diverse varianti su questa sintassi (ad esempio usando $slice, eccetera.). Non riesco a trovare alcuna spiegazione chiara su come realizzare questo tipo di aggiornamento in MongoDB.


44
2017-07-07 03:39


origine


risposte:


Come previsto, la query è facile una volta che sai come. Ecco la sintassi, in python:

db["my_collection"].update(
    { "_id": ObjectId(document_id) },
    { "$set": { 'documents.'+str(doc_index)+'.content' : new_content_B}}
)

55
2017-07-07 14:29



L'aggiornamento di un elemento di matrice a cui fa riferimento un indice (ad esempio 1) in Mongo Shell può essere eseguito anche indicando direttamente il valore dell'indice:

db.my_collection.update(
    {_id : "document_id"},
    {$set : {"my_array.1.content" : "New content B"}}
)

21
2017-12-09 11:40



In stile mongo, usando l'operatore posizionale '$'. Controlla questo collegamento per dettagli.

db.my_collection.update(
  {_id: ObjectId(document_id), my_array.1 : 1 },
  { $set: { "my_array.$.content" : "NEW content B" } }
)

13
2018-05-05 17:03



db.my_collection.update(
  {_id: ObjectId(document_id), my_array : { ... old content A ... } },
  { $set: { "my_array.$.content" : "NEW content B" } }
)

0
2017-07-21 10:48