2012-02-12 14 views
12

belirli elemanı güncellemek:mongodb Ben şu şemaya bir koleksiyona sahip altdizilim

Ben _ID = 28 fakat belgede dizideki öğelerden birini güncellemeniz gerekir
{ 
    "_id" : 28, 
    "n" : [{ 
     "a" : ObjectId("4ef8466e46b3b8140e000000"), 
     "c" : 28, 
     "p" : [ObjectId("4f00640646b3b88005000003"), ObjectId("4f00640146b3b88005000002"), ObjectId("4f00637d46b3b8cc0e000001"), ObjectId("4f00638046b3b8cc0e000002"), ObjectId("4f00638246b3b8cc0e000003"), ObjectId("4f00631646b3b85002000001"), ObjectId("4f00631846b3b85002000002")], 
     "u" : 26 
    }, { 
     "a" : ObjectId("4ef8466e46b3b8140e000000"), 
     "c" : 10, 
     "p" : [ObjectId("4f00640146b3b88005000002"), ObjectId("4f0063fd46b3b88005000001")], 
     "u" : 26 
    }, { 
     "a" : ObjectId("4ef8467846b3b8780d000001"), 
     "u" : 26, 
     "p" : [ObjectId("4f00637b46b3b8cc0e000000")], 
     "c" : 28 
    }, { 
     "a" : ObjectId("4ef85a3e46b3b84408000000"), 
     "u" : 26, 
     "p" : [ObjectId("4f00631046b3b85002000000")], 
     "c" : 28 
    }] 
} 

sadece a ise = bazı değer ve c =

db.coll.update({ 
'_id' : 28, 
'n.a' : new ObjectId('4ef85a3e46b3b84408000000'), 
'n.c' : 28 
}, 
{ 
    $push : { 
    'n.$.p' : ObjectId("4b97e62bf1d8c7152c9ccb74") 
    }, 
    $set : { 
    'n.$.t' : ISODate("2013-05-13T14:22:46.777Z") 
    } 
}) 

Böylece temelde belirli diziden eleman güncellemek istiyorum bazı değere: kadarıyla görebileceğimiz üzere ve bu dördüncü unsurdur. Sorun, sorgu yürütülürken, büyük olasılıkla ilk öğeyi güncelleştirmesidir.

Nasıl düzeltebilirim?

cevap

23

Kodunuzdaki sorun dot-notation çünkü nokta notasyonu belirttiğinizde, belirtilen filtre ölçütlerinin tüm ölçütleri karşılayan tek dizi öğesiyle eşleşmesi gerektiğini varsayıyorsunuz. Ama öyle değil. Tek bir kriterle eşleşirse, dizilerdeki nokta gösterimi herhangi bir dizi öğesini toplayabilir. Bu yüzden beklenmedik güncellemeyi alıyorsunuz.

$elemMatch ürününü array öğesindeki tüm filtreleri eşleştirmek için kullanmanız gerekir.

db.coll.update({ 
'_id' : 28, 
n: { 
    $elemMatch:{ 
     a : new ObjectId('4ef85a3e46b3b84408000000'), 
     c : 28 } 
    } 
}, 
{ 
    $push : { 
    'n.$.p' : ObjectId("4b97e62bf1d8c7152c9ccb74") 
    }, 
    $set : { 
    'n.$.t' : ISODate("2013-05-13T14:22:46.777Z") 
    } 
}) 

ve çıkış

{ 
     "a" : ObjectId("4ef85a3e46b3b84408000000"), 
     "c" : 28, 
     "p" : [ 
      ObjectId("4f00631046b3b85002000000"), 
      ObjectId("4b97e62bf1d8c7152c9ccb74") 
     ], 
     "t" : ISODate("2013-05-13T14:22:46.777Z"), 
     "u" : 26 
    } 
olduğu