El problema en su código es dot-notation
porque cuando especifica la notación de puntos, asume que los criterios de filtro especificados deben coincidir con el único elemento de matriz que satisface todos los criterios. Pero no es así. La notación de puntos en las matrices puede seleccionar cualquier elemento de la matriz si coincide algún criterio único. Es por eso que está recibiendo la actualización inesperada.
Tienes que usar $elemMatch
para hacer coincidir todos los filtros en el array
elemento.
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")
}
})
y la salida es
{
"a" : ObjectId("4ef85a3e46b3b84408000000"),
"c" : 28,
"p" : [
ObjectId("4f00631046b3b85002000000"),
ObjectId("4b97e62bf1d8c7152c9ccb74")
],
"t" : ISODate("2013-05-13T14:22:46.777Z"),
"u" : 26
}