Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Удаление словаря из массива Mongodb по номеру (pymongo)

#python #mongodb #pymongo


В коллекции есть массив со словарями:

{
"_id": {
    "$oid": "576502aca43aa11ca48bb8d5"
},
"event_name": "Тестовое",
"participants": [
    {
        "name": "Участник 1",
        "start_debt": 2500,
        "income": 0,
        "debt": 2500
    },
    {
        "name": "Участник 2",
        "start_debt": 2500,
        "income": 0,
        "debt": 2500
    },
    {
        "name": "Участник 3",
        "start_debt": 2500,
        "income": 0,
        "debt": 2500
    },
    {
        "name": "Участник 3",
        "start_debt": 2500,
        "income": 0,
        "debt": 2500
    }
],
"debt": 10000,
"income": 0,
"budget": 10000}


Нужно удалить элемент из массива(словарь) именно по порядковому номеру.

Пытался сделать таким образом:

data_base.update_one({"_id": ObjectId(event_id)},
                                 {'$pull': {'participants': 2}})


Естественно результата не добился.
    


Ответы

Ответ 1



Напрямую удалить элемент по индексу пока нельзя, смотрите ишью https://jira.mongodb.org/browse/SERVER-1014. Но можно обойти с помощью двух последовательных команд: mongo.db.collection.update({}, {'$unset': {'participants.2':1}}) mongo.db.collection.update({}, {'$pull': {'participants': None}}) Сначала заменяем нужный элемент (в данном случае с индексом 2) на null, затем второй командой удаляем его. Большой минус - действия не атомарные, и после выполнения первого, какое то время в массиве будет элемент со значением null. Если это критично, то верный способ это вручную считать/модифицировать/записать документ.

Комментариев нет:

Отправить комментарий