Нормализация экземпляров против нормализации партии

Проблема в вашем коде - dot-notation, потому что при указании точечной нотации вы предполагаете, что указанные критерии фильтра должны соответствовать единому элементу массива, который удовлетворяет всем критериям. Но это не так. Точечная запись на массивы может захватывать любой элемент массива, если совпадают какие-либо критерии. Вот почему вы получаете неожиданное обновление.

Вы должны использовать $elemMatch для соответствия всем фильтрам в элементе array.

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")
  }
})

, а выход -

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

34
задан Maxim 5 January 2018 в 19:35
поделиться