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.
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}}
)
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"}}
)
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" } }
)
db.my_collection.update(
{_id: ObjectId(document_id), my_array : { ... old content A ... } },
{ $set: { "my_array.$.content" : "NEW content B" } }
)