簡體   English   中英

MongoDB,Mongoose來自一個Find來搜索另一個集合

[英]MongoDB, Mongoose results from one Find to search another collection

我知道這違反了MongoDB及其No-SQL模型的設計,但我試圖在一個集合中查找Documents,然后使用結果中的ID字段來查找另一個集合中的相應記錄。 有效地嘗試模擬聯接。

//query is irrelevant to question
var results = collectionOne.find(query).limit(limit);

var a = [];

results.forEach(function(r)
{
    var aquery = { id : {$eq : r.id}};
    collectionTwo.find(aquery).limit(limit).exec(function, b)
    {
        if (err)
        {
            res.render('error',
            {
                status :  500
            });
        }
        else
        {
            a.push(b);
        }
   });
});
res.jsonp(a);

雖然MongoDB中有一些新功能,例如$lookup ,它可以進行“加入”,但您的特定操作並不需要這樣。 你在這里所做的就是從另一個集合中返回結果,該集合基於前一個_id值的位置。

為此,最好的選擇是使用$in在另一個集合上再發一個查詢。

// Mongoose turns a cursor to an array by default in the callback method
collectionOne.find(query,{ "_id": 1}).limit(limit).exec(function(err,results) {

    // Just get array of _id values
    var ids = results.map(function(el) { return el._id } );

    // Not sure if you really mean both collections have the same primary key
    // I'm presuming two different fields being "id" as opposed to "_id"
    collectionTwo.find({ "id": { "$in": ids } },function(err,items) {
       // matching results are here
    })

})

而已。

您所做的就是將_id值的第一個查詢結果作為“列表”返回,然后將該參數提供給目標集合中相關字段的$in

如果您真的想要“加入”並且可以使用MongoDB 3.2,那么您可以像這樣使用$lookup

collectionOne.aggregate([
    { "$match": query },
    { "$limit": limit },
    { "$lookup": {
        "from": "collectionTwo",
        "localField": "_id",
        "foreignField": "id",
        "as": "twoItems"
    }}
])

這是一個真正的“加盟”的結果,盡管你可能用它剛剛從返回匹配結果collectionTwo ,那么我個人不會。 即使在服務器上也是昂貴的練習,並且進一步過濾實際返回該格式所需的操作將最終花費更多。

您還可以在.populate()閱讀.populate() ,這實際上是此類查詢的“反向”。 相反,它的過程是存儲指向相關集合中對象的主鍵的ObjectId值的數組(或常規字段,但在這種情況下為數組)。 因此,如果collectionTwo有“很多”值,那么這些值將存儲在collectionOne文檔中的數組中。

同樣,這是一個“加入模擬”而不是真正的連接。 結果類似於$lookup ,並且同樣不是“just”來自collectionTwo的結果,而是“加入”版本,您同樣需要過濾。

.populate()真正發生的是它無論如何都$in運行$in查詢。 因此,即使在父項中存儲子引用的所有工作(恕我直言,在大多數情況下,如果你可以這樣做,那么你也可以只是嵌入數據),與數據庫的實際交互保持不變,因為它仍然執行$in query。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM