2015-08-24 3 views
0

У меня есть две коллекции (так и temp_so).Upsert вместо сохранения mongodb

Мой запрос:

db.getCollection('temp_sale_order').find({},'orderItemId'). 
    forEach(function(element) { db.getCollection('sale_order').save(element); }); 

У меня есть документ с orderItemId 123 в temp_so. Я хочу проверить, существует ли документ с orderItemId, поэтому запрос должен обновить весь документ. Если документ с orderItemId не существует, он должен создать его.

Запрос должен сделать это для всех документов в temp_so.

Мой текущий запрос просто вставляет данные так и не проверяет, существует ли документ с orderItemId или нет. Как исправить это?

В SQL это можно записать в виде:

insert into so (select * from temp_so where orderItemId not in (select orderItemId from so)); 
Update so set col = select col from temp_so where temp_so.orderItemId = so.orderItemId. 
*update for all the columns* 

ответ

1

Технически говоря, .save() действие уже «обертка» вокруг «upsert», это просто только когда-либо смотрел на _id поле только и где присутствует.

Так что вам просто нужно четко указать, в каком поле вы смотрите. А также удаление существующего _id:

db.getCollection('temp_sale_order').find({},{ 'orderItemId': 1 }). 
    forEach(function(element) { 
    delete element._id; 
    db.getCollection('sale_order').update(
     { "orderItemId": element.orderItemId }, 
     element, 
     { "upsert": true } 
    ); 
}); 

Вы также можете считать, что вы не хотите, чтобы заменить весь документ и предпочел бы просто «вставить» только первый вхождение. Что и делает $setOnInsert здесь:

db.getCollection('temp_sale_order').find({},{ 'orderItemId': 1}). 
    forEach(function(element) { 
    delete element._id; 
    db.getCollection('sale_order').update(
     { "orderItemId": element.orderItemId }, 
     { "$setOnInsert": { "orderItemid": element.orderItemId } }, 
     { "upsert": true } 
    ); 
}); 

Так что в принципе означает, что любое изменение в $setOnInsert фактически не будет применяться, если это не на самом деле является «upsert» и новый документ создается. Если это просто «совпадение», тогда ничего в документе не будет изменено.

+0

предыдущий ответ был прав '' orderItemId''. '{'orderItemId': 1}' удаляет все остальные значения ключа в документе. Thanx. –

+0

@ManishGupta Второй параметр в '.find()' - это оператор проектирования, который «предназначен» для выбора только указанных полей. Вместо этого вместо «строки» ничего не делать. Поэтому, если вы не хотите выбирать только определенные поля, то полностью опустите «проецирование». –

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