Также, если вы используете сторонние библиотеки, убедитесь, что у вас есть правильные 32/64 битные файлы
Нет прямого способа вытягивания / удаления по индексу массива. Фактически, это открытая проблема http://jira.mongodb.org/browse/SERVER-1014 , вы можете проголосовать за нее.
Обходной путь использует $ unset а затем $ pull:
db.lists.update({}, {$unset : {"interests.3" : 1 }})
db.lists.update({}, {$pull : {"interests" : null}})
Обновление: как упоминалось в некоторых комментариях, этот подход не является атомарным и может вызвать некоторые условия гонки, если другие клиенты читают и / или записывают между двумя операциями. Если нам нужна операция, чтобы быть атомарной, мы могли бы:
Я бы рекомендовал использовать поле GUID (я склонен использовать ObjectID) или поле автоматического увеличения для каждого поддокумента в массиве.
С помощью этого GUID легко вывести $ pull и убедиться, что правильный будет вытащен. То же самое касается других операций с массивами.
Вместо использования $ pull мы можем использовать $ pop для удаления элементов в массиве по его индексу. Но вы должны вычесть 1 из позиции индекса для удаления на основе индекса.
Например, если вы хотите удалить элемент в индексе 0, вы должны использовать -1, для индекса 1 вы должны использовать 0 и так далее ...
Запрос для удаления третьего элемента (гаджеты):
db.people.update({"name":"dannie"}, {'$pop': {"interests": 1}})
для справки: https: //docs.mongodb. ком / ручной / ссылки / оператор / обновление / поп /
Вместо того, чтобы использовать отмену (как в принятом ответе), я решаю это, установив для поля уникальное значение (т. е. не 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.
Вы можете использовать модификатор $pull
операции update
для удаления определенного элемента в массиве. Если вы предоставили запрос, он будет выглядеть так:
db.people.update({"name":"dannie"}, {'$pull': {"interests": "guitar"}})
Кроме того, вы можете использовать $pullAll
для удаления всех вхождений. Подробнее об этом на странице официальной документации - http://www.mongodb.org/display/DOCS/Updating#Updating-%24pull
Это не использует индекс as критерии удаления элемента, но могут помочь в случаях, подобных вашим. IMO, используя индексы для адресации элементов внутри массива, не очень надежна, поскольку mongodb не согласован по порядку элементов как fas, как я знаю.