web-dev-qa-db-fra.com

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 pas de champs dont je peux garantir qu'ils 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 ... }
  ]
}

Il semble que la requête devrait ressembler à ceci:

//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é trop de temps à rechercher les documents mongodb et à essayer différentes variantes de cette syntaxe (par exemple, en utilisant $slice, etc.). Je ne trouve aucune explication claire sur la façon de réaliser ce type de mise à jour dans MongoDB.

58
Abe

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}}
)
65
Abe

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

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

Dans le style mongo, en utilisant l'opérateur positionnel '$'. 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" } }
)
19
Doel
db.my_collection.update(
  {_id: ObjectId(document_id), my_array : { ... old content A ... } },
  { $set: { "my_array.$.content" : "NEW content B" } }
)
5
znbwo

Vous pouvez utiliser la fonction updateOne de mongoDB en passant l'index de l'élément dans le tableau, si la clé de ancien contenu B est "value" par exemple:

[
...
"value" : "old content A"
"value" : "old content B"
"value" : "old content C"
...
]

la commande devrait être comme ceci:

db.collection.updateOne({"_id" : "...,"},{$set: {"my_array.1.value": "NEW content B"}})
0
Samuel Cabral