收集:
[{
_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查询,但这只适用于一个简单的值数组。
答案 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查询工作方式的基本部分。