【问题标题】:Query elements if their array of objects has properties with repeated elements查询元素,如果它们的对象数组具有重复元素的属性
【发布时间】:2020-11-24 11:22:04
【问题描述】:

通过收集包含以下文档:

{
    "_id" : "1",
    "Name" : "Name1",
    "Children" : [ 
        {
            "_id" : "1",
            "Name" : "Name1",
            "Type" : "One"
        }, 
        {
            "_id" : "2",
            "Name" : "Name2",
            "Type" : "One"
        }, 
        {
            "_id" : "5",
            "Name" : "Name5",
            "Type" : "Two"
        },
    ]
},
{
    "_id" : "2",
    "Name" : "Name2",
    "Children" : [ 
        {
            "_id" : "3",
            "Name" : "Name3",
            "Type" : "One"
        }, 
                {
            "_id" : "4",
            "Name" : "Name4",
            "Type" : "Two"
        }, 
    ]
},
{
    "_id" : "3",
    "Name" : "Name3",
    "Children" : [ 
        {
            "_id" : "7",
            "Name" : "Name7",
            "Type" : "Two"
        }, 
                {
            "_id" : "6",
            "Name" : "Name6",
            "Type" : "Two"
        }, 
    ]
}

我只想在 Children 包含具有重复 Type 属性的对象时查询文档。例如对象 1 具有三个对象的 Children,其属性 Type 出现两次(一、一、二)。对象 3 有两个 Children 对象,它们都有 Type = Two。对象 2 具有所有唯一的 Children(一、二)。因此查询将匹配对象 13

【问题讨论】:

    标签: mongodb mongodb-query nosql


    【解决方案1】:

    这可能会对您有所帮助.. 这背后的想法,我们将有孩子总数并在删除重复项后进行比较。如果两个计数都不匹配,那么我们将其作为文档获取

    • $reduce 统计孩子的总数并将有一个重复的孩子 (dupChildren)
    • $unwind 解构数组
    • $project 删除不需要的数据。由于我们需要匹配$type,所以我们删除dupChildren中的其他人
    • $group 重构数组以删除重复的type
    • $size 统计dupChildren 数组
    • $match 如果 totalChildren 和 count 都相等,则消除
    • $project 删除不需要的字段

    这是脚本

    db.collection.aggregate([
      {
        $addFields: {
          totalChildren: {
            $reduce: {
              input: "$Children",
              initialValue: 0,
              in: {
                $add: [ "$$value", 1 ]
              }
            }
          },
          dupChildren: "$Children"
        }
      },
      {
        $unwind: "$dupChildren"
      },
      {
        $project: {
          "dupChildren._id": 0,
          "dupChildren.Name": 0
        }
      },
      {
        $group: {
          _id: "$_id",
          Name: { $first: "$Name" },
          Children: { $first: "$Children" },
          totalChildren: { $first: "$totalChildren" },
          dupChildren: { $addToSet: "$dupChildren" }
        }
      },
      {
        $addFields: {
          count: { $size: "$dupChildren" }
        }
      },
      {
        $match: {
          $expr: {
            $ne: [ "$totalChildren", "$count" ]
          }
        }
      },
      {
        $project: {
          dupChildren: 0,
          count: 0,
          totalChildren: 0
        }
      }
    ])
    

    工作Mongo playground

    【讨论】:

    • 感谢您的努力,实际上它解决了问题,但在我的情况下没有,因为我有一个很大的文档,我无法列出 $group 运算符中的所有属性
    猜你喜欢
    • 1970-01-01
    • 2016-07-25
    • 2015-04-27
    • 1970-01-01
    • 2020-11-07
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多