Masalah dalam kode Anda adalah dot-notation
karena Saat Anda menentukan notasi titik, Anda menganggap bahwa kriteria filter yang ditentukan harus cocok dengan elemen larik tunggal yang memenuhi semua kriteria. Tapi tidak. Notasi titik pada array dapat mengambil elemen array apa pun jika ada kriteria tunggal yang cocok. Itulah mengapa Anda mendapatkan pembaruan yang tidak terduga.
Anda harus menggunakan $elemMatch
untuk mencocokkan semua filter dalam array
elemen.
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")
}
})
dan hasilnya adalah
{
"a" : ObjectId("4ef85a3e46b3b84408000000"),
"c" : 28,
"p" : [
ObjectId("4f00631046b3b85002000000"),
ObjectId("4b97e62bf1d8c7152c9ccb74")
],
"t" : ISODate("2013-05-13T14:22:46.777Z"),
"u" : 26
}