什么样的MongoDB查询在数组中多次找到相同的值?

时间:2015-09-21 12:32:55

标签: mongodb mongodb-query aggregation-framework

说我在MongoDB中有这样的文档

{
    "mylist":[
        {"value": 1},
        {"value": 2},
        {"value": 3}
    ]
},
{
    "mylist":[
        {"value": 1},
        {"value": 2},
        {"value": 1}
    ]
}

如何在列表中多次查询{"value": 1}次文件(即后者)?

2 个答案:

答案 0 :(得分:2)

使用$where进行JavaScript评估时可能最好处理:

db.colletion.find({
    "$where": function() {
        return this.mylist.filter(function(el) {
            return el.value == 1;
        }).length >= 1;
    }
})

目前在汇总方面没有那么大的处理:

db.collection.aggregate([
    { "$redact": {
        "if": { "$eq": [ { "$ifNull": [ "$value", 1 ] }, 1 },
        "then": "$$DESCEND",
        "else": "$$PRUNE"
    }},
    { "$redact": {
        "if": { "$gt": [{ "$size": "$mylist" }, 1 ] },
        "then": "$$KEEP",
        "else": "$$PRUNE"
    }}
])

或者$filter

将来会更好地处理
db.collection.aggregate([
    { "$redact": {
        "if": {
            "$gt": [
                { "$size": { "$filter": {
                    "input": "$mylist",
                    "as": "el",
                    "cond": {
                        "$eq": [ "$$el.value", 1 ]
                    }
                }}},
                1
            ]
        },
        "then": "$$KEEP",
        "else": "$$PRUNE"
    }}
])

在MongoDB的下一个版本发布之前,后一个运算符尚未可用。但总的来说,你希望能够过滤掉" count"比赛的发生。这有几种方法可以做到这一点。

答案 1 :(得分:0)

您可以使用聚合管道 - 我建议展开数组,然后按原始文档和值进行分组,然后过滤以仅保留那些计数大于1的结果。