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