【问题标题】:How to retrieve document with a subset of keys from a larger set in MongoDB?如何使用 MongoDB 中较大集合中的键子集检索文档?
【发布时间】:2020-11-29 04:29:32
【问题描述】:

我有一个数据库,其中包含包含字符串数组的文档。类似于文档的东西 {name: "Test", keys: [["key1","key2"],["key3"],["key4", key5","key6"],["key7"]]}

给定一个键列表,我想在数据库中查询每个子数组中至少有一个键的所有文档。因此,如果我要求给定键列表的所有文档:“key1”、“key3”、“key5”、“key7”、“key9”,则将返回上述文档,因为所有内部数组都至少有一个键来自查询。

但是,如果给定一个键列表,例如:“key1”、“key3”、“key7”、“key9”,则不会返回上述文档,因为第三个内部数组不包含其中一个键。

我做了很多研究,但找不到解决方法。我不知道这是否可能。但是,所有输入将不胜感激。谢谢!

【问题讨论】:

    标签: arrays database mongodb


    【解决方案1】:

    一个技巧是

    • 我们将使用$map 获得$keys 和用户给定值之间的所有相交值。同时获取总数。
    • 使用$filter 删除所有非元素数组并获取计数
    • $match检查两个计数,如果两个计数相同,则您可以检索文档,否则删除文档

    脚本是

    db.collection.aggregate([
      {
        $addFields: {
          dupkeys: {
            "$map": {
              input: "$keys",
              in: {
                "$setIntersection": [
                  "$$this",
                  ["key3","key1", "key4","key7"]
                ]
              }
            }
          },
          total: {  $size: "$keys" }
        }
      },
      {
        $addFields: {
          nonMatched: {
            $size: {
              $filter: {
                input: "$dupkeys",
                cond: {
                  $ne: [ "$$this", [] ]
                }
              }
            }
          }
        }
      },
      {
        $match: {
          $expr: {
            $eq: ["$total", "$nonMatched" ]
          }
        }
      }
    ])
    

    工作Mongo playground

    【讨论】:

    • 非常感谢!这正是我所需要的。我还没有处理太多聚合数据。但是,我认为这就是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多