Обновить вспомогательные документы в mongodb с условием [duplicate]

Нет надежного способа перечислить все методы объекта. dir(object) обычно полезен, но в некоторых случаях он не может перечислить все методы. Согласно dir() документации : «С аргументом попытайтесь вернуть список допустимых атрибутов для этого объекта.»

Проверка этого метода существует может быть сделано callable(getattr(object, method)), как уже упоминалось там.

12
задан Salvador Dali 12 February 2012 в 08:45
поделиться

1 ответ

Проблема в вашем коде - 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
    }
23
ответ дан RameshVel 26 August 2018 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: