我有以下几套文件:
[
{
"_id":1,
"a":2,
"b":{
"q":[1,2,3],
"c":[{"d":1,"e":2,"f":3},{"d":1,"e":2,"f":3},{"d":2,"e":4,"f":5}]
}
},
{
"_id":2,
"a":4,
"b":{
"c":[{"d":2,"e":4,"f":5},{"d":2,"e":4,"f":5}],
"qq":5
}
},
{
"_id":3,
"b":{
"c":[{"d":2,"e":4,"f":5}],
"ff":5
}
},
{
"_id":4,
"b":{
"c":[{"d":2,"e":4,"f":5},{"d":1,"e":4,"f":5},{"d":2,"e":3,"f":5}],
"fre":5,
"qaacs":[]
}
},
{
"_id":5,
"b":{
"c":[{"d":2,"e":4,"f":5},{"d":1,"e":4,"f":5},{"d":2,"e":3,"f":5}],
"fre":5,
"qaacs":[]
}
}
]
我的目标是找到文档,其中数组"c"
包含n个重复元素或m个总计元素。
为了这个例子,让我们让n = 2和m = 3。
在这种情况下,应该是以下结果
[
{
"_id":1,
"a":2,
"b":{
"q":[1,2,3],
"c":[{"d":1,"e":2,"f":3},{"d":1,"e":2,"f":3},{"d":2,"e":4,"f":5}]
}
},
{
"_id":2,
"a":4,
"b":{
"c":[{"d":2,"e":4,"f":5},{"d":2,"e":4,"f":5}],
"qq":5
}
},
{
"_id":4,
"b":{
"c":[{"d":2,"e":4,"f":5},{"d":1,"e":4,"f":5},{"d":2,"e":3,"f":5}],
"fre":5,
"qaacs":[]
}
},
{
"_id":5,
"b":{
"c":[{"d":2,"e":4,"f":5},{"d":1,"e":4,"f":5},{"d":2,"e":3,"f":5}],
"fre":5,
"qaacs":[]
}
}
]
通过此查询可以获得总共有m个元素的查找数组
coll.aggregate([{"$match":{"b":{"$exists":True},"b.c":{"$size":m}}}])
,但我不知道如何获取重复计数。
我的第一个想法是在“ c”上使用$ group并以这种方式获得计数,但是发现这是不可能的。
答案 0 :(得分:0)
您需要使用$setIntersection
运算符。当仅与数组一起使用时,它将从数组中返回唯一值。
方法::要计算数组的n
副本,首先,我们将计算数组的实际大小和数组唯一元素的大小。现在,我们将计算这两个数字之间的差,如果它大于等于n-1
,则意味着该数组具有n
个重复项(在本例中为1
,如{{ 1}})。最后,使用n=2
运算符,我们将获得所需的结果。
查询:
$or