105 votes

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 n'arrive pas à trouver 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 être quelque chose comme ça :

//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 dans la documentation de mongodb et à essayer différentes variations de cette syntaxe (par exemple en utilisant $slice etc.). Je ne trouve pas d'explication claire sur la manière d'effectuer ce type de mise à jour dans MongoDB.

87voto

Abe Points 2137

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

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

64voto

tomaskazemekas Points 2038

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 de l'index :

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

61voto

Doel Points 772

Dans le style Mongo, en utilisant l'opérateur positionnel '$'. Regardez ceci enlace pour les détails.

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

29voto

mahbub.kuet Points 544

Lorsqu'il est nécessaire de mettre à jour un élément d'un tableau sans connaître son indice réel mais en ayant un identifiant unique de l'élément :

// Modify a comment in a bucket
db.POST_COMMENT.update(
    {
        "_id": ObjectId("5ec424a1ed1af85a50855964"),
        "bucket.commentId": "5eaf258bb80a1f03cd97a3ad_lepf4f"
    },
    {
        $set: {
            "bucket.$.text": "Comment text changed",
            "bucket.$.createdDate": ISODate("2015-12-11T14:12:00.000+0000")
        }
    }
)

Aquí "bucket.commentId" est l'identifiant unique d'un élément du tableau.

10voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X