2012-07-07 36 views
40

Bir mongodb belgesindeki bir dizide bulunan tek bir alt bileşeni güncellemeye çalışıyorum. Dizi dizini kullanarak alana başvurmak istiyorum (dizideki öğeler benzersiz tanımlayıcılar olacağından emin olabileceğim herhangi bir alana sahip değil). Bunun kolay olması gerektiği gibi görünüyor, ama sözdizimini anlayamıyorum.MongoDB: Dizideki dizin tarafından başvurulan bir dizideki tek bir alt öğeyi nasıl güncellerim?

İşte pseudo-json'da yapmak istediğim şey.

önce:

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

böyle bir şey olmalı sorguya benziyor:

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

Ama bu işe yaramazsa

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

sonra. Uzun zamandır mongodb dokümanı araştırmayı ve bu sözdiziminde farklı varyasyonları denemeyi (örneğin, $slice vb. Kullanarak) geçirdim. MongoDB'de bu tür bir güncellemenin nasıl gerçekleştirileceğine dair net bir açıklama bulamıyorum.

cevap

51

Beklendiği gibi, nasıl yapıldığını öğrendikten sonra sorgulama kolaydır. İşte buradaki sözdizimi, python:

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

Hayır .. .. öyleydi Gerçekten bilinmeyen. – Moumit

10

"$" konumsal operatörü kullanarak mongo tarzında. Ayrıntılar için bu link'a bakın.

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

bir dizin tarafından başvurulan bir dizi öğesinin Güncelleme (1 örn) Mongo Kabuğu'nda doğrudan da endeks değerinin belirterek yapılabilir:

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" } } 
) 
İlgili konular