mongodb - 如何在一个集合中查找未被另一集合中的文档引用的 MongoDB 文档?

标签 mongodb

我正在 MonogDB 中寻找一种有效的方法来确定一个集合中的哪些文档未被另一个集合中的文档引用。

数据库包含两个集合,inventorytags,其中 inventory 中的一些(不是全部)文档引用了 之一标签文档:

{
    "_id" : ObjectId("5e8df3c02e197074f39f61ea"), 
    "tag" : ObjectId("5e89a1af96d5d8b30aead768"), 
    "ean" : "5707196199178", 
    "location" : "shelf 1"
},
{
    "_id" : ObjectId("5e8df211727079cdc24e20e1"), 
    "ean" : "5707196199178", 
    "location" : "shelf 1"
}

“标签”文档没有引用库存中的文档:

{
    "_id" : ObjectId("5e7d174fc63ce5b0ca80b89a"), 
    "nfc" : { "id" : "04:5f:ae:f2:c2:66:81" }, 
    "barcode" : { "code" : "29300310", "type" : "EAN8" }
},
{
    "_id" : ObjectId("5e89a1af96d5d8b30aead768"), 
    "nfc" : { "id" : "04:48:af:f2:c2:66:80" }, 
    "barcode" : { "code" : "29300716", "type" : "EAN8" }
},
{
    "_id" : ObjectId("5e7d1756c63ce5b0ca80b89c"), 
    "nfc" : { "id" : "04:02:ae:f2:c2:66:81" }, 
    "barcode" : { "code" : "29300648", "type" : "EAN8" }
}

由于并非 tags 中的所有文档都在 inventory 文档中使用,因此我不能简单地将它们作为子文档。

现在我需要确定哪些tags 文档被任何inventory 文档引用。我不想维护从 tagsinventory 的反向引用,以免出现不一致的风险(除非这可以由 MongoDB 自动完成?)。

我对 MongoDB 非常陌生,从到目前为止我所了解到的情况来看,我的印象是 View 可能就是我所需要的。但我似乎缺乏适当的搜索词来找到可以帮助我充分理解以继续进行的示例。也许我需要一些不同的东西,我希望您的意见能为我指明正确的方向。

最佳答案

您需要使用 $lookup 执行 MongoDB 聚合允许连接两个集合的运算符。

如果存在“tags文档未被任何inventory文档引用”,join字段将为空数组。

下一步,我们使用 $size 运算符过滤空数组。

尝试下面的查询:

db.tags.aggregate([
  {
    $lookup: {
      from: "inventory",
      localField: "_id",
      foreignField: "tag",
      as: "join"
    }
  },
  {
    $match: {
      "join": {
        $size: 0
      }
    }
  },
  {
    $project: {
      join: 0
    }
  }
])

tags not referenced | inventory not referenced

关于mongodb - 如何在一个集合中查找未被另一集合中的文档引用的 MongoDB 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61116699/

相关文章:

python - MongoDB中的内存错误

javascript - Mongoose 数组返回空?

C# MongoDB bulk Upsert - 批量写入操作导致一个或多个错误

mongodb - 使用 "Trusted Connection"连接到 Mongo 数据库的连接字符串的语法

javascript - 在 Meteor 中获取或创建

node.js - 为什么MongoDB Node Driver生成实例池被破坏错误?

mongodb - 将域类从 GORM 独立模块导入 Grails

java - Spring聚合框架: How to create nested $divide, $subtract,$mod查询?

mysql - 如何将数据从mongodb迁移到mysql?

javascript - ElasticSearch 查询过滤掉某些摄像头