mongodb - 查询元素,如果它们的对象数组具有重复元素的属性
问题描述
通过收集包含以下文档的集合:
{
"_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具有所有唯一的孩子(一,二)。所以查询将匹配对象1和3。
解决方案
这可能会对您有所帮助.. 这背后的想法,我们将有孩子总数并在删除重复项后进行比较。如果两个计数不匹配,那么我们将其作为文档获取
$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游乐场
推荐阅读
- vue.js - 如何存储购物车物品?饼干?
- python - 如何在特定日期自动触发 python 脚本?
- python - 使用 python pandas pivot 时保持秩序
- firebase - Firestore HTTP Insomnia 查询:HTTP/2 框架层中的流错误
- javascript - 在 aws-sdk 中为 sqs 设置 dataType JSON
- python - 具有日期时间索引的多列上的 Pandas 滚动窗口
- cypress - 赛普拉斯模拟地理定位
- spring-boot - Springdoc 与多模块 gradle
- pine-script - 在 pine 脚本中为标签设置警报
- sql - 如何从列中选择所有不重复的条目?