2016-03-04 3 views
3

У меня есть db;Вставить элемент массива после определенного значения в mongodb

{"_id" : 1 , children: ["2", "123", "5"]} 

Я хочу вставить элемент в дочерний массив. Это легко, когда вы знаете индекс. $ позиция может использоваться для этой цели. Подобно;

db.module_menu.update({"_id" : "1"} , 
         {$push : {"children" : { 
            $each : ["12"] , $position : 1}}}); 

Но позволяет сказать, что я не знаю индекс позиции, я знаю значение элемента, который я хочу вставить после.

У меня есть value: 12 и значение, которое я хочу вставить после. insertAfter: 2

В результате это должно быть;

{"_id" : 1, text: "" , children: ["2","12", "123", "5"]} 

Как это сделать?

Пройдите через каждый элемент в массиве children, найдите индекс значения и, используя $ position, вставьте значение. Это единственный способ сделать это?

+0

Вы можете попробовать с $ addToSet –

+0

$ addToSet может не держать массивы заказа –

+0

$ addToSet просто как $ толчок ? Он добавляет к концу набора. Я ошибаюсь? –

ответ

1

Боюсь, что это невозможно. Существует старая проблема использования $function in update, но вы можете только читать, изменять и сохранять массив.

С другой стороны, если у вас есть массив встроенных документов, вы можете использовать $ positional operator. $ может использоваться для $set значение в вашем простом массиве, но до $push.

> db.test.find() 
{ "_id" : ObjectId("56d9570d09e01f20e254d0f3"), "a" : [ 1, 2, 3 ] } 
> db.test.update({"_id": ObjectId("56d9570d09e01f20e254d0f3"), "a": 2}, 
       {$push: {a: {$each: [2], $position: "$"}}}) 
WriteResult({ 
    "nMatched" : 0, 
    "nUpserted" : 0, 
    "nModified" : 0, 
    "writeError" : { 
     "code" : 2, 
     "errmsg" : "The value for $position must be a positive numeric value not a String" 
    } 
}) 
0

Там нет функции, чтобы получить позицию и обновление на одном дыхании, так в вас проблемы вам нужно получить позицию перед обновлением и передать его для запроса - так это означает, что мы работаем на 1: 1 bassis.

Другой подход состоит в получении данных - выполнить на месте обновления и нажмите полный набор набора обратно в Монго

Смежные вопросы