2013-11-06 4 views
4

Теперь я получаю две коллекции: coll01 и coll02.Как обновить коллекцию на основе другой коллекции в MongoDB?

И структура coll01 такова:

{ 
    id: 01, 
    name: "xxx", 
    age: 30 
} 

и структура coll02, как:

{ 
    id: 01, 
    name: "XYZ" 
    gender: "male" 
} 

Два ID поля в обоих коллекции индексов. И количество документов в этих двух коллекциях одинаково.

И то, что я хочу делать в традиционных SQL является:

update coll01, coll02 
set coll01.name = coll02.name 
where coll01.id = coll02.id 
+0

Это очень распространенный вариант использования монго. При переходе с SQL на Mongo часто вам нужно обновить идентификаторы int с помощью Mongo ObjectID. Меня не волнует, с какими данными вы работаете: все данные связаны и являются реляционными. Документы лица (и поддокументы) должны каким-то образом сопоставлять документы заказов. –

ответ

11

MongoDB не реляционная база данных и не поддерживает присоединиться х. Итак, вы должны немного подумать, вам действительно нужно mongodb для ваших целей?

Решение для обновления вы можете обновить каждый документ из coll01 цикла:

db.coll01.find().forEach(function (doc1) { 
    var doc2 = db.coll02.findOne({ id: doc1.id }, { name: 1 }); 
    if (doc2 != null) { 
     doc1.name = doc2.name; 
     db.coll01.save(doc1); 
    } 
}); 

индекс для id поля в coll02 коллекции уменьшится find() работы время выполнения внутри цикла. Также см. О выполнении JavaScript на стороне сервера: Running .js files via a mongo shell Instance on the Server

+0

u не хватает $ и в мастере запроса – G1P

+0

вы должны использовать findOne вместо find, find возвращает курсор к выбранным документам. – Soren

+0

@ Сорин, спасибо. Вы совершенно правы. – Shad

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