#javascript #mongodb #nosql
#javascript #mongodb #nosql
Вопрос:
как мне добавить значение в начало массива в mongodb?
допустим, у меня есть этот документ в моей коллекции mongo:
{ "colors" : [ "red", "green", "blue" ] }
как мне добавить «желтый» в начало списка?
когда я делаю:
{$push:{colors:"yellow"}}
я бы понял это:
{ "colors" : [ "red", "green", "blue", "yellow" ] }
я хочу это:
{ "colors" : [ "yellow", "red", "green", "blue"] }
заранее спасибо!
Комментарии:
1. Эй, @conman, не могли бы вы изменить принятый ответ? Спасибо!
Ответ №1:
Для тех, кто новичок в этом, MongoDB 2.6 поддерживает $position
оператор, который можно использовать для достижения желаемого эффекта. Преимущество здесь в том, что вам не нужно возвращать весь массив документов, обновлять его локально и сохранять — $position
оператор означает, что все можно сделать атомарно.
Вам нужно использовать его в сочетании с $each
:
$push: { colors: { $each: ['yellow'], $position: 0 } }
Комментарии:
1.
$push - $each - $position: 0
Синтаксис неудобный. Пожалуйста, помогите реализовать $unshift, проголосовав по этому вопросу .2. спасибо за ваш обходной путь. Я согласен, что мы могли бы использовать $unshift, но пока это делает свое дело.
Ответ №2:
«unshift» вставляет данные в начало массива.. тогда как «push» вставляет его в конец. например, в JavaScript:
> a = ['red','green','blue']
[ "red", "green", "blue" ]
> a.unshift("yellow")
4
> a
[ "yellow", "red", "green", "blue" ]
Но, к сожалению, это не поддерживается API Mongo как атомарная операция:
http://www.mongodb.org/display/DOCS/Updating
он просто поддерживает «push»
Насколько велик ваш массив?
вы могли бы предположить, что ваш массив в Mongo всегда хранится в обратном порядке, и использовать push, или вы могли бы считывать массив, изменять его с помощью unshift, а затем сохранять его снова (что, однако, не было бы атомарным)
Комментарии:
1. я не верю, что mongodb поддерживает модификатор unshift. я сделал это: db.testarray.update({«_id»: ObjectId(«4df7a9e469408e69b19abd08»)},{$unshift:{цвета: «розовый»}}). и получил эту ошибку: указан недопустимый модификатор $unshift.
2. Да, именно так это было реализовано временно. Извлекаем весь массив, добавляем элементы в начало, затем сохраняем его обратно. Но, как вы упомянули, оно больше не атомарное. Я думаю, что другое предложение сработает. Мне просто нужно прочитать его в обратном порядке. Я надеялся, что mongodb предоставил собственный способ выполнения вставок в начало. Спасибо за предложение! О, и массив может вырасти довольно большим. В зависимости от пользователя. Установленного предела нет.
3. команда 10gen довольно открыта для предложений, когда дело доходит до улучшений MongoDB .. вы могли бы попробовать ввести это в качестве запроса функции для API
4. да, я думаю, что сделаю это. просто хотел убедиться, что я не пропустил функцию в api. спасибо, ребята!
5. Есть запрос функции: SERVER-2362
Ответ №3:
Альтернативный способ отменить сдвиг объекта — это push(), а затем reverse() . Я не уверен, сработает ли это, если вы планируете сохранить исходную последовательность.