按数组Mongodb中的字段值过滤文档

时间:2014-09-17 13:19:03

标签: mongodb mongodb-query aggregation-framework node-mongodb-native

收集:

[{
    _id: 'Foo',
    plugs: [
        { type: 'CE', code: 12 },
        { type: 'SH': code: 34 }
    ]
},{
    _id: 'Bar',
    plugs: [
        { type: 'T2', code: 23 },
        { type: 'T2': code: 43 }
    ]
}]

在插件数组中可能是具有相同类型的条目。当我进行聚合时,我想按插头类型过滤文档。例如。仅返回包含T2类型的插件的文档。我怎么能在mongodb做到这一点?我知道$ in查询,但这只适用于一个简单的值数组。

1 个答案:

答案 0 :(得分:4)

基于正常.find()的投影在预期只有一个匹配时效果很好,但聚合框架目前是唯一会返回"多个"数组的结果:

db.collection.aggregate([
    // Still makes sense to "filter" the documents
    { "$match": { "plugs.type": "T2" } },
    { "$unwind": "$plugs" },
    // This actually "filters" the array content
    { "$match": { "plugs.type": "T2" } },
    { "$group": {
        "_id": "$_id",
        "plugs": { "$push": "$plugs" }
    }}
])

即使使用MongoDB 2.6或更高版本,您也可以使用" unique" " set"下的条目约束:

db.collection.aggregate([
    { "$match": { "plugs.type": "T2" } },
    { "$project": {
        "plugs": {
            "$setDiffernce": [
                { "$map": {
                     "input": "$plugs",
                     "as": "el",
                     "in": {
                         "$cond": [
                             { "$eq": [ "$$el.type", "T2" ] },
                             "$$el",
                             false
                         ]
                     }
                }},
                [false]
            ]
        }
    }}
])

但实际上你只是在谈论"文件匹配"而不是"元素过滤",所以这里聚合框架是过度的。只需匹配文件:

db.collection.find({ "plugs.type": "T2" })

这只会返回"文件"其中至少有一个元素符合条件。这是对查询模式在MongoDB中如何实际工作的基本理解的一部分。

此处的基本类型使用"dot notation"来指定" part"文件标识。它是MongoDB查询工作方式的基本部分。