MongoDb 模拟 2 个集合之间的连接

Posted

技术标签:

【中文标题】MongoDb 模拟 2 个集合之间的连接【英文标题】:MongoDb simulate Join between 2 collections 【发布时间】:2016-04-21 16:10:59 【问题描述】:

是否可以在 MongoDb 3.0 中模拟连接?

问题:

我有 2 个集合(A 和 B)。集合 A 中的文档有一个引用集合 B 中文档的键。

我想获取集合 B 中没有集合 A 中任何引用文档的所有文档。

【问题讨论】:

我可以向您展示如何在本机 mongoDB shell 中执行此操作,但我觉得您不需要这样做。您使用的是 javascript 后端吗? 我正在使用 .Net,但如果你能给我一个例子,我将更改代码以在 C# 中工作。顺便说一句,我正在使用 Mongo 3.0。 您使用的是哪个版本的 Mongo? 3.2 支持通过 $lookup 聚合阶段进行左外连接。 我找到了 $lookup 但它只在 3.2 可用:( 在这种情况下,不,您必须在应用程序中执行连接。 【参考方案1】:

这是一个使用 NodeJS 的 Mongoose 驱动程序的示例。能够在 shell 中执行此操作并没有太大帮助,所以这里是在 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/

编辑:顺便说一句,我不再相信我能够向您展示如何在 Mongo shell 中执行此操作,因为我忘记了 $lookup 现在在 3.0 中不可用。其他人的回答(我想是删除了?)也遇到了这个问题。

【讨论】:

以上是关于MongoDb 模拟 2 个集合之间的连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在两个集合之间建立查找连接

常见问题:MongoDB基础知识

MongoDB

在 Express.js 应用程序中打开多个 MongoDB 连接

在 Express.js 应用程序中打开多个 MongoDB 连接

MongoDB - 启动&连接数据库