Страницы

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

понедельник, 25 февраля 2019 г.

Удаление словаря из массива 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}})
Естественно результата не добился.


Ответ

Напрямую удалить элемент по индексу пока нельзя, смотрите ишью 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. Если это критично, то верный способ это вручную считать/модифицировать/записать документ.

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

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