Нет надежного способа перечислить все методы объекта. dir(object)
обычно полезен, но в некоторых случаях он не может перечислить все методы. Согласно dir()
документации : «С аргументом попытайтесь вернуть список допустимых атрибутов для этого объекта.»
Проверка этого метода существует может быть сделано callable(getattr(object, method))
, как уже упоминалось там.
Проблема в вашем коде - 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
}