2016-04-21 2 views
0

Можно ли имитировать соединение в MongoDb 3.0?MongoDb simulate Присоединиться к двум коллекциям

Проблема:

У меня есть 2 коллекции (А и В). Документы из коллекции A есть ключ, который ссылается на документ в коллекции В.

Я хочу, чтобы получить все документы в коллекции B, которые не имеют какой-либо документ, на который ссылается в коллекции А.

+0

Я могу показать вам, как это сделать в родной оболочке mongoDB, но у меня есть ощущение, что вам не нужно это делать. Используете ли вы бэкэнд javascript? – awimley

+0

Я использую .Net, но если вы можете привести мне пример, я изменю код для работы на C#. Btw Я использую Mongo 3.0. –

+0

Какую версию Монго вы используете? 3.2 поддерживает левые внешние соединения через этап агрегации [$ lookup] (https://docs.mongodb.org/manual/reference/operator/aggregation/lookup/). – BanksySan

ответ

0

Ниже приведен пример с использованием Драйвер Mongoose для NodeJS. Это не то, что полезно, чтобы иметь возможность сделать это в скорлупе, так вот она в Mongooose:

var docsWithoutA = []; 
var stream = db.colB.find({}).stream(); 
stream.on("data", function (doc) { 
    colA.find({"_id": doc.referenceKeyHere}, function (err, docs) { 
    if (err) return; 
    if (!docs[0]) { docsWithoutA.push(doc) } //doc here is the doc from B with no find results in A 
    //found at least one ref'd doc. 
    }) 
}) 
stream.on("close", function() { 
    console.log(docsWithoutA); //Stream closes, here is your list 
}) 

Это временно присоединиться к выполнению вашего конкретного запроса.

Настоящий ответ заключается в том, что вы никогда не должны присоединяться к MongoDB, ссылки этого класса лучше всего обрабатывать путем создания поддокументов. Больше информации: https://docs.mongodb.org/manual/

EDIT: Кстати, я больше не уверен в своем утверждении, чтобы показать вам, как это сделать в оболочке Mongo, поскольку я забыл, что $ lookup теперь недоступен в версии 3.0. Ответ кого-то другого (удаленный, я думаю?) Также столкнулся с этой проблемой.

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