【问题标题】:MongoDb simulate Join between 2 collectionsMongoDb 模拟 2 个集合之间的连接
【发布时间】: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 可用:(
  • 在这种情况下,不,您必须在应用程序中执行连接。

标签: mongodb


【解决方案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 中不可用。其他人的回答(我想是删除了?)也遇到了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-24
    • 2011-04-07
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多