Обновление массива в pymongo - PullRequest
2 голосов
/ 10 июля 2019

Я пытаюсь поддерживать некоторые счетчики в mongodb, поэтому мне нужно периодически обновлять их.У меня был код, работающий правильно, когда структура данных была одного уровня:

mlcol.find_one_and_update({"connip": conip}, {"$inc":{ts:1}}, upsert=True)

Это привело к такой структуре:

{
    "connip": "a",
    "1":1,
    "2":1,
    "3":1,
    "4":1
}

Я хочу преобразовать структуру данных во что-тонапример:

{
    "connip": "a",
    "timeline": [
        {
            "timeslot": "1",
            "counter": 1
        },
        {
            "timeslot": "2",
            "counter": 1
        }
    ]
}

Когда я отправляю эту команду:

mlcol.find_one_and_update({"connip": "a", "timeline.timeslot": "c"}, {"$inc":{"timeline.$.counter":1}}, upsert=True)

Я получаю правильное обновление уже существующих счетчиков, но если это новое, я получаю следующееошибка:

pymongo.errors.OperationFailure: The positional operator did not find the match needed from the query.

Похоже, что необходимо сначала запустить команду insetr_one:

ne = {"connip": "a","timeline":[{"timeslot": "c","counter":1},{"timeslot": "d","counter":1}]}
mlcol.insert_one(ne)

Есть ли способ форсировать создание счетчика в случае его отсутствияранее?Это то, что команда в плоской структуре делает правильно.

...