как мне добавить значение в начало массива в mongodb?

#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() . Я не уверен, сработает ли это, если вы планируете сохранить исходную последовательность.