查找子文档中的数组重复或具有特定大小的文档

时间:2020-06-06 09:30:32

标签: mongodb

我有以下几套文件:

[

    {
        "_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并以这种方式获得计数,但是发现这是不可能的。

1 个答案:

答案 0 :(得分:0)

您需要使用$setIntersection运算符。当仅与数组一起使用时,它将从数组中返回唯一值。

方法::要计算数组的n副本,首先,我们将计算数组的实际大小和数组唯一元素的大小。现在,我们将计算这两个数字之间的差,如果它大于等于n-1,则意味着该数组具有n个重复项(在本例中为1,如{{ 1}})。最后,使用n=2运算符,我们将获得所需的结果。

查询:

$or
相关问题