как удалить объект в массиве по индексу mongodb / mongoose [duplicate]

Также, если вы используете сторонние библиотеки, убедитесь, что у вас есть правильные 32/64 битные файлы

86
задан Ray Toal 14 August 2013 в 22:19
поделиться

5 ответов

Нет прямого способа вытягивания / удаления по индексу массива. Фактически, это открытая проблема http://jira.mongodb.org/browse/SERVER-1014 , вы можете проголосовать за нее.

Обходной путь использует $ unset а затем $ pull:

db.lists.update({}, {$unset : {"interests.3" : 1 }}) 
db.lists.update({}, {$pull : {"interests" : null}})

Обновление: как упоминалось в некоторых комментариях, этот подход не является атомарным и может вызвать некоторые условия гонки, если другие клиенты читают и / или записывают между двумя операциями. Если нам нужна операция, чтобы быть атомарной, мы могли бы:

  • Прочитать документ из базы данных
  • Обновить документ и удалить элемент в массиве
  • Заменить документ в базе данных. Чтобы гарантировать, что документ не изменился с момента его чтения, мы можем использовать обновление, если текущий шаблон описан в файлах mongo
121
ответ дан Javier Ferrero 28 August 2018 в 04:09
поделиться

Я бы рекомендовал использовать поле GUID (я склонен использовать ObjectID) или поле автоматического увеличения для каждого поддокумента в массиве.

С помощью этого GUID легко вывести $ pull и убедиться, что правильный будет вытащен. То же самое касается других операций с массивами.

2
ответ дан Climax 28 August 2018 в 04:09
поделиться

Вместо использования $ pull мы можем использовать $ pop для удаления элементов в массиве по его индексу. Но вы должны вычесть 1 из позиции индекса для удаления на основе индекса.

Например, если вы хотите удалить элемент в индексе 0, вы должны использовать -1, для индекса 1 вы должны использовать 0 и так далее ...

Запрос для удаления третьего элемента (гаджеты):

db.people.update({"name":"dannie"}, {'$pop': {"interests": 1}})

для справки: https: //docs.mongodb. ком / ручной / ссылки / оператор / обновление / поп /

0
ответ дан Mohan Krishnan 28 August 2018 в 04:09
поделиться

Вместо того, чтобы использовать отмену (как в принятом ответе), я решаю это, установив для поля уникальное значение (т. е. не NULL), а затем сразу же вытащив это значение. Немного безопаснее с асинхронной перспективы. Вот код:

    var update = {};
    var key = "ToBePulled_"+ new Date().toString();
    update['feedback.'+index] = key;
    Venues.update(venueId, {$set: update});
    return Venues.update(venueId, {$pull: {feedback: key}});

Надеемся, что mongo рассмотрит это, возможно, расширив модификатор $ position, чтобы поддерживать $ pull, а также $ push.

2
ответ дан Stephen Orr 28 August 2018 в 04:09
поделиться

Вы можете использовать модификатор $pull операции update для удаления определенного элемента в массиве. Если вы предоставили запрос, он будет выглядеть так:

db.people.update({"name":"dannie"}, {'$pull': {"interests": "guitar"}})

Кроме того, вы можете использовать $pullAll для удаления всех вхождений. Подробнее об этом на странице официальной документации - http://www.mongodb.org/display/DOCS/Updating#Updating-%24pull

Это не использует индекс as критерии удаления элемента, но могут помочь в случаях, подобных вашим. IMO, используя индексы для адресации элементов внутри массива, не очень надежна, поскольку mongodb не согласован по порядку элементов как fas, как я знаю.

18
ответ дан Sunseeker 28 August 2018 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: