首页 > 解决方案 > 如何在一个集合中查找另一个集合中的文档未引用的 MongoDB 文档?

问题描述

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

该数据库包含两个集合,inventorytags,其中一些(不是所有)文档inventory引用了其中一个tags文档:

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

“标签”文档没有对以下文档的任何引用inventory

{
    "_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文件引用。我宁愿不必维护从tagsto的反向引用,以免出现inventory不一致的风险(除非这可以由 MongoDB 自动完成?)。

我对 MongoDB 很陌生,到目前为止,我的印象是视图可能是我需要的。但我似乎缺乏适当的搜索词来找到帮助我理解足以继续进行的示例。也许我需要一些不同的东西,在这里我希望您的意见能够为我指明正确的方向。

标签: mongodb

解决方案


您需要使用允许连接两个集合的$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未引用| inventory未引用


推荐阅读