首页 > 解决方案 > 查询元素,如果它们的对象数组具有重复元素的属性

问题描述

通过收集包含以下文档的集合:

{
    "_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具有三个对象的对象,其属性类型出现两次(一、一、二)。对象3有两个Children对象,它们都有Type = Two。对象2具有所有唯一的孩子(一,二)。所以查询将匹配对象13

标签: mongodbmongodb-querynosql

解决方案


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

  • $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游乐场


推荐阅读