数组内所有对象重复的所有Mongo文档

时间:2019-09-13 11:39:17

标签: mongodb

查找数组中具有重复对象的文档。

某些答案仅适用于由“基本类型元素”组成的数组(即字符串数组)。在这里,我想过滤某些对象字段

例如:

{ 
    "name": "1",
    "arr": [{ "type": "fruit", "name":"pear"},{ "type": "fruit","name":"banana"}]
},
{
    "name":"2",
    "arr": [{"type":"fish"}]
}

鉴于以上两个文档,我只想检索文档1,因为它在数组中具有2个具有相同类型的元素。 (当然,我希望所有具有这种属性的文档,而不仅仅是一个)

1 个答案:

答案 0 :(得分:0)

以下查询可以为我们提供预期的输出:

db.collection.find({
    $expr:{
        $ne:[
            {
                $size:"$arr"
            },
            {
                $size:{
                    $setUnion:["$arr.type"]
                }
            }
        ]
    }
}).pretty()

数据集:

{
    "_id" : ObjectId("5d7b8546d76ccfa3cb0f133c"),
    "name" : "1",
    "arr" : [
        {
            "type" : "fruit",
            "name" : "pear"
        },
        {
            "type" : "fruit",
            "name" : "banana"
        }
    ]
}
{
    "_id" : ObjectId("5d7b8546d76ccfa3cb0f133d"),
    "name" : "2",
    "arr" : [
        {
            "type" : "fish"
        }
    ]
}
{
    "_id" : ObjectId("5d7b8546d76ccfa3cb0f133e"),
    "name" : "3",
    "arr" : [
        {
            "type" : "product",
            "name" : "watch"
        },
        {
            "type" : "product",
            "name" : "Pen"
        }
    ]
}

输出:

{
    "_id" : ObjectId("5d7b8546d76ccfa3cb0f133c"),
    "name" : "1",
    "arr" : [
        {
            "type" : "fruit",
            "name" : "pear"
        },
        {
            "type" : "fruit",
            "name" : "banana"
        }
    ]
}
{
    "_id" : ObjectId("5d7b8546d76ccfa3cb0f133e"),
    "name" : "3",
    "arr" : [
        {
            "type" : "product",
            "name" : "watch"
        },
        {
            "type" : "product",
            "name" : "Pen"
        }
    ]
}

查询分析:我们正在过滤arr的大小不等于type中存在的唯一arr的数量的文档