2012-07-07 13 views
40

Próbuję zaktualizować pojedyncze podelement zawarte w tablicy w dokumencie mongodb. Chcę odwołać się do pola za pomocą indeksu tablicy (elementy w tablicy nie mają żadnych pól, które gwarantuję, będą unikalnymi identyfikatorami). Wydaje się, że to powinno być łatwe do zrobienia, ale nie mogę wymyślić składni.MongoDB: Jak zaktualizować pojedyncze podelement w tablicy, do którego odwołuje się indeks w tablicy?

Oto, co chcę zrobić w pseudo-jsonie.

Przed:

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

Po:

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

Wygląda zapytania powinno być coś takiego:

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

Ale to nie działa. Spędziłem zbyt długo przeszukując dokumentację mongodów i próbując różnych odmian tej składni (np. Używając $slice itd.). Nie mogę znaleźć żadnego jasnego wyjaśnienia, jak wykonać tego rodzaju aktualizację w MongoDB.

Odpowiedz

51

Zgodnie z oczekiwaniami zapytanie jest proste, gdy wiesz, jak to zrobić. Oto składnia w pythonie:

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

Nie było .. .. naprawdę nieznane. – Moumit

10

W stylu mongo, za pomocą operatora pozycji "$". Aby uzyskać szczegółowe informacje, zapoznaj się z tym link.

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

aktualizacji elementu tablicy wymienionej o indeksie (np 1) Mongo powłoka może być wykonywana przez bezpośrednie wskazanie wartości indeksu:

db.my_collection.update(
    {_id : "document_id"}, 
    {$set : {"my_array.1.content" : "New content B"}} 
) 
0
db.my_collection.update(
    {_id: ObjectId(document_id), my_array : { ... old content A ... } }, 
    { $set: { "my_array.$.content" : "NEW content B" } } 
) 
Powiązane problemy