Подтвердить что ты не робот

Можете ли вы использовать mongo $push prepend вместо добавления?

Я хотел бы добавить push в начале моего набора, а не добавлять его до конца, когда я нажимаю mongo $.

Можно ли сделать обновление атомарного push, которое добавляет элементы как первые, а не последние?


Обновление 2014: да, вы можете.

4b9b3361

Ответ 1

Как и в MongoDB v2.5.3, есть новый оператор $position, который вы можете включить вместе с оператором $each как часть вашего запроса $push, чтобы указать местоположение в массиве, в котором вы хотели бы вставьте значение.

Вот пример страницы документа, чтобы добавить элементы 20 и 30 в индекс массива 2::

db.students.update( { _id: 1 },
                    { $push: { scores: {
                                         $each: [ 20, 30 ],
                                         $position: 2
                                       }
                             }
                    }
                  )

Ссылка: http://docs.mongodb.org/master/reference/operator/update/position/#up._S_position

Ответ 2

Используйте отрицательный индекс с $set for prepend, проверенный в mongo v2.2:

> db.test.insert({'array': [4, 5, 6]})
> db.test.find()
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"),
  "array" : [ 4, 5, 6 ] }

//prepend 3
> db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")}, 
                 {'$set': {'array.-1':     3}})
> db.test.find()
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"), 
  "array" : [ 3, 4, 5, 6 ] }

//prepend 2
> db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")}, 
                 {'$set': {'array.-1':     2}})
> db.test.find()
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"), 
  "array" : [ 2, 3, 4, 5, 6 ] }

//prepend 1
> db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")}, 
                 {'$set': {'array.-1':     1}})
> db.test.find()
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"), 
  "array" : [ 1, 2, 3, 4, 5, 6 ] }

Ответ 3

Аналогичный вопрос был задан несколько дней назад. К сожалению, короткий ответ: "нет", но есть открытый запрос для этой функции.
https://jira.mongodb.org/browse/SERVER-2191 - "$push() перед массивом"

В другом потоке есть дополнительная информация, а также возможная работа: "Использовать массив MongoDB как стек" - Использовать массив MongoDB как стек

Надеемся, что приведенное выше будет полезно и поможет вам найти приемлемую рабочую среду.