我们有两个系列.

一个是拥有大量数据的books个集合.喜欢:

{
   '_id' {"$oid": "64ba6a416504f1f01d773faa"},
   'isbn': 8765434567890,
   'booktitle': 'some text',
}
{
   '_id' {"$oid": "64ba6a416504f1f01d773faa"},
   'isbn': 8765434566666,
   'booktitle': 'other book',
}

notes集合包含有关基本集合中某些文档的额外信息的文档.喜欢:

{
   '_id' {"$oid": "64ba6a416504f1f01d773faa"},
   'isbn': 8765434567890,
   'note': 'blabla',
}

因此,并不是books中的所有文档都有notes中的对应文档.如果有的话,那就是one-to-one.

我试图找出的是一个聚合,它显示了所有books个文档(可能还有附加的{Match}内容),特别是notes集合中的do not have a counterpart个文档.

[
   {'$match': {}},
   {'$lookup':
      {
        'from': 'notes',
        'localField': 'isbn',
        'foreignField': 'isbn',
        'as': 'related_note',
      }
   },
   {'$project':
      {
         'isbn': '$isbn',
         'title': '$title',
         'note': '-- no notes about this title',
      }
   }
]

所以不是左连接,也不是右连接,而是:NOT(左连接)

有人吗?谢谢.

推荐答案

我试图找出的是一个聚合,它显示了所有的图书文档(可能带有附加的{Match}内容),这些文档在Notes集合中没有对应的内容.*

会说您的结果应该是左连接,但不包括交集.

enter image description here

参考文献:SQL joins as Venn diagram

默认情况下,MongoDB $lookup作为左连接执行.要排除交叉点下的文档,可以通过$match阶段使用related_note: []进行筛选.

db.books.aggregate([
  //{
  //  "$match": {}
  //},
  {
    "$lookup": {
      "from": "notes",
      "localField": "isbn",
      "foreignField": "isbn",
      "as": "related_note"
    }
  },
  {
    $match: {
      related_note: []
    }
  },
  {
    "$project": {
      "isbn": "$isbn",
      "title": "$title",
      "note": "-- no notes about this title",
      
    }
  }
])

Demo @ Mongo Playground

Mongodb相关问答推荐

MongoDB聚合:将文档列表转换为列表

MongoDB$unionWith,如何 Select 特定文档

无法在Ubuntu 22.04上安装MongoDB 7.0

没有文档的MongoDB集合中的不一致,但当我执行count()时,它告诉我有15个文档

使用MongoDB 4将根文档替换为数组

为什么数组长度0被认为是Mongoose中排序中最大的数字

Mongo 将一个数组链接到另一个数组

通过 docker 运行的 MongoDB 服务器无法互相看到(名称解析中的临时故障)

mongodump 是否锁定数据库?

如何更新 mongodb 文档以向数组添加新元素?

从性能Angular 来看 MongoDB 嵌入式与参考

MongoDB:在集合上设置 TTL 索引时出错: sessions

Python - Pymongo 插入和更新文档

如何在 Node.js 中格式化 Mongoose 的日期?

在 Mongo 中,$near 和 $nearSphere 有什么区别?

如何在 Meteor 应用程序之间共享 MongoDB 集合?

查询不等于 null 或空的地方

Mongodb Atlas:管理员未授权执行命令

Mongoose 为所有嵌套对象添加 _id

如何使用 mongodb-java-driver 进行 upsert