【问题标题】:How to find MongoDB documents in one collection not referenced by documents in another collection?如何在另一个集合中的文档未引用的一个集合中查找 MongoDB 文档?
【发布时间】:2020-04-09 17:14:44
【问题描述】:

我正在 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 很陌生,从目前所学的知识来看,我的印象是视图可能是我需要的。但我似乎缺乏适当的搜索词来找到帮助我理解足以继续进行的示例。也许我需要一些不同的东西,在这里我希望您的意见能够为我指明正确的方向。

【问题讨论】:

    标签: mongodb


    【解决方案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

    【讨论】:

    • 感谢您提供完美的解决方案!而对于 mongoplayground 的链接,正是我所需要的,但还不知道。
    猜你喜欢
    • 2012-05-29
    • 2014-03-19
    • 1970-01-01
    • 2016-02-22
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    相关资源
    最近更新 更多