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 个集合之间的连接的主要内容,如果未能解决你的问题,请参考以下文章
在 Express.js 应用程序中打开多个 MongoDB 连接