Команды обновления работают через оболочку mongo, но не через pymongo

Я пытаюсь обновить массив внутри монго документа с помощью pymongo но это не работает, но скопировать тот же запрос в robomongo работает. (возвращается {'n': 1, 'nModified': 0, 'ok': 1.0, 'updatedExisting': True})

roboMongo:

db.my_collection.updateMany(
    {'start_time': 1501700400.0},
    {'$pull': {'related': {'$in': [{'KEY': '1', 'TYPE': 'my_type'}]}}},
    {upsert:true}
)

код пимонго:

query_document = {'start_time': 1501700400.0}
update_command = {'$pull': {'related': {'$in': [{'KEY': '1', 'TYPE': 'my_type'}]}}}
_client[db][collection].update_many(query_document, update_command, True)

документ:

{
    "_id" : ObjectId("598570c4ffd387293e368c8d"),
    "related" : [ 
        {
            "KEY" : "6",
            "TYPE" : "my_type"
        }, 
        {
            "KEY" : "2",
            "TYPE" : "my_type"
        }, 
        {
            "KEY" : "3",
            "TYPE" : "my_type"
        }, 
        {
            "KEY" : "5",
            "TYPE" : "my_type"
        }, 
        {
            "KEY" : "8",
            "TYPE" : "my_type"
        }
    ],
    "end_time" : 1501621200.0,
    "start_time" : 1501700400.0
}

Я думаю, может быть, это связано с "и"?

любой совет?

Спасибо

1 ответ

Решение

{'KEY': '1', 'TYPE': 'my_type'} должен быть заказан, поэтому я форсирую заказ, выполнив:

ordered_relateds = []
for ptr in ptrs_to_remove:
    ordered_ptrs.append(collections.OrderedDict(sorted(related.items(), key=lambda t: t[0])))

update_command = {"$pull": {"related": {"$in": ordered_related}}}

Таким образом, KEY всегда будет первым элементом в хэше, а TYPE - вторым.

Другие вопросы по тегам