MongoDB: comment mettre à jour un seul sous-élément dans un tableau, référencé par l'index dans le tableau?

J'essaie de mettre à jour un seul sous-élément contenu dans un tableau dans un document mongodb. Je veux référencer le champ en utilisant son index de tableau (les éléments du tableau n'ont aucun champ que je peux garantir seront des identifiants uniques). Il semble que cela devrait être facile à faire, mais je ne peux pas comprendre la syntaxe.

Voici ce que je veux faire en pseudo-json.

Avant:

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

Après:

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

Semble que la requête devrait être quelque chose comme ce:

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

Mais ça ne marche pas. J'ai passé beaucoup trop de temps à chercher les documents mongodb, et à essayer différentes variations sur cette syntaxe (par exemple en utilisant $slice, etc.). Je ne trouve aucune explication claire sur la façon d'accomplir ce genre de mise à jour dans MongoDB.

45
demandé sur Massimiliano Kraus 2012-07-07 07:39:52

4 réponses

Comme prévu, la requête est facile une fois que vous savez comment. Voici la syntaxe, en python:

db["my_collection"].update(
    { "_id": ObjectId(document_id) },
    { "$set": { 'documents.'+str(doc_index)+'.content' : new_content_B}}
)
57
répondu Abe 2012-07-07 14:29:00

La mise à jour d'un élément de tableau référencé par un index (par exemple 1) dans le Shell Mongo peut également être effectuée en indiquant directement la valeur de l'index:

db.my_collection.update(
    {_id : "document_id"},
    {$set : {"my_array.1.content" : "New content B"}}
)
24
répondu tomaskazemekas 2017-09-12 17:19:28

Dans le style mongo, en utilisant l'opérateur de position'$'. Consultez ce lien pour plus de détails.

db.my_collection.update(
  {_id: ObjectId(document_id), my_array.1 : 1 },
  { $set: { "my_array.$.content" : "NEW content B" } }
)
16
répondu Doel 2017-08-13 15:12:16
db.my_collection.update(
  {_id: ObjectId(document_id), my_array : { ... old content A ... } },
  { $set: { "my_array.$.content" : "NEW content B" } }
)
0
répondu znbwo 2017-07-21 10:48:28