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

时间:2020-04-09 08:13:10

标签: 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文档。我希望不必维护从tagsinventory的引用,以免出现不一致的风险(除非MongoDB可以自动完成此操作?)。

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

1 个答案:

答案 0 :(得分:1)

您需要使用$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