2016-07-04 3 views
1

Мне нужно вставить объект в каждый массив в документе MongoDB. Ниже представлен массив items: itemList; в каждом itemList Мне нужно вставить itemSpec. Желаемая форма документа до и после процесса показана ниже:Вставить объект в элемент массива MongoDB

Перед процессом

{ 
    "items": [ 
    { 
     "itemList":{ 
     "rejected": true 
     }, 
     "fProcBy": "automatic" 
    }, 
    { 
     "itemList":{ 
     "rejected": true 
     }, 
     "fProcBy": "automatic" 
    } 
    ] 
} 

После процесса:

{ 
    "items": [ 
    { 
     "itemList":{ 
     "rejected": true 
     }, 
     "itemSpec":{ 
     "approved": true 
     }, 
     "fProcBy": "automatic" 
    }, 
    { 
     "itemList":{ 
     "rejected": true 
     }, 
     "itemSpec":{ 
     "approved": true 
     }, 
     "fProcBy": "automatic" 
    } 
    ] 
} 

Таким образом, в каждом элементе items массива там должна быть вставлена новое свойство объекта itemSpec.

ответ

1

$ push Оператор для обновления массива в документе.

Попробуйте:

db.test.update({"_id":"yourUniqueId"}, 
       {$push: { "items":{ "itemSpec":{"approved": true}}}}); 
+0

это добавит itemSpec как «элемент» пункты массив. OP хочет, чтобы добавить его в реальных элементов вместо – Newton

+0

Это создает новый элемент массива, как показано ниже, я должен обновить, как я уже упоминал выше { «пунктов»: [ { «ITEMLIST»: { «отверг»: правда } , "fProcBy": "автоматический" }, { "ITEMLIST": { "отверг": правда }, "fProcBy": "автоматический" }, { "itemSpec": { " одобрено ": истина } } ] } –

+0

Я не понял, что вы хотели сказать! можете ли вы рассказать мне, в чем проблема? –

2

Я не в курсе решения, которое делает его в один проход, но со следующего простого сценария максимальное число итераций равно максимальному числу массива элементы, которые вы имеете в единых документах, которые, вероятно, не столь высоки (но это только предположение, как у меня нет никакой дополнительной информации о данных):

var q = { "items.itemSpec": null }; 
var u = { 
    $set: { 
     "items.$.itemSpec" : { 
      "approved": true 
     } 
    } 
}; 
var yourColl = db.getCollection('fooBar'); 
while (yourColl.find(q).count() > 0) { 
    yourColl.update(q, u, { multi: true }); 
} 
Смежные вопросы