问题描述
我想找到所有带"AHU":"C"的区域数据.首先,我查询没有投影并得到这些.
I want to find all zone data with "AHU":"C". First, I query without projection and get these.
> db.buildings.find({"zone.AHU": "C"}).pretty()
{
"_id" : ObjectId("5aba4460a042dc4a2fdf26cd"),
"name" : "Test Street",
"coordinate" : [
12,
31
],
"yearlyEnergyCost" : 1444,
"zone" : [
{
"name" : "AHU-C-Z2",
"_id" : ObjectId("5aba4460a042dc4a2fdf26ce"),
"AHU" : "C",
"precooling" : [ ],
"subZone" : [ ]
},
{
"name" : "AHU-D-Z1",
"_id" : ObjectId("5abc7528100730697163a3ab"),
"AHU" : "D",
"precooling" : [ ],
"subZone" : [ ]
},
{
"name" : "AHU-C-Z1",
"AHU" : "C",
"_id" : ObjectId("5ac09c898249affa03506eff"),
"precooling" : [ ],
"subZone" : [ ]
},
{
"name" : "AHU-C-Z3",
"AHU" : "C",
"_id" : ObjectId("5ac09c898249affa03506efe"),
"precooling" : [ ],
"subZone" : [ ]
}
],
"__v" : 2
}
但是,当我使用$ elemMatch时,它仅返回带有"AHU"的第一个区域元素:"C"
However, when I use $elemMatch, it only returns the first zone element with "AHU":"C"
> db.buildings.find({"zone.AHU": "C"}, {_id: 0, zone: {$elemMatch: {AHU: "C"}}}).pretty()
{
"zone" : [
{
"name" : "AHU-C-Z2",
"_id" : ObjectId("5aba4460a042dc4a2fdf26ce"),
"AHU" : "C",
"precooling" : [ ],
"subZone" : [ ]
}
]
}
从 doc 中,我意识到$ elemMatch(投影)仅检索第一个,但如何检索所有对应的(AHU-C-Z1,AHU-C-Z2,AHU-C-Z3)?谢谢.
From the doc, I realised that $elemMatch (projection) only retrieve the first one, but how can I retrieve all corresponded (AHU-C-Z1, AHU-C-Z2, AHU-C-Z3)? Thanks.
这是集合:
{
"_id":{
"$oid":"5aa65bc96996e045104116e7"
},
"name":"Talker Street",
"coordinate":[
11.82,
-9.26
],
"yearlyEnergyCost":100,
"zone":[
{
"name":"AHU-B-Z1",
"_id":{
"$oid":"5aa65bc96996e045104116e8"
},
"precooling":[
{
"_id":{
"$oid":"5aa73a7d2f991a657fd52c7e"
},
"resultPrecool":{
"$oid":"5aa73a7d2f991a657fd52b5d"
},
"dateRun":{
"$date":"2018-03-14T00:00:00.000+0000"
},
"lastUpdated":{
"$date":"2018-03-13T02:41:02.086+0000"
}
}
]
},
{
"name":"AHU-B-Z2",
"_id":{
"$oid":"5aa9f1f8131e6412c17d71d3"
},
"precooling":[
]
},
{
"name":"AHU-B-Z3",
"_id":{
"$oid":"5aa9f1f8131e6412c17d71d2"
},
"precooling":[
]
}
],
"__v":19
}{
"_id":{
"$oid":"5aba4460a042dc4a2fdf26cd"
},
"name":"Test Street",
"coordinate":[
12,
31
],
"yearlyEnergyCost":1444,
"zone":[
{
"name":"AHU-C-Z2",
"_id":{
"$oid":"5aba4460a042dc4a2fdf26ce"
},
"AHU":"C",
"precooling":[
],
"subZone":[
]
},
{
"name":"AHU-D-Z1",
"_id":{
"$oid":"5abc7528100730697163a3ab"
},
"AHU":"D",
"precooling":[
],
"subZone":[
]
},
{
"name":"AHU-C-Z1",
"AHU":"C",
"_id":{
"$oid":"5ac09c898249affa03506eff"
},
"precooling":[
],
"subZone":[
]
},
{
"name":"AHU-C-Z3",
"AHU":"C",
"_id":{
"$oid":"5ac09c898249affa03506efe"
},
"precooling":[
],
"subZone":[
]
}
],
"__v":2
}{
"_id":{
"$oid":"5aba46c41c8d5e4b52462aea"
},
"name":"123123",
"coordinate":[
12,
31
],
"yearlyEnergyCost":12321,
"zone":[
{
"name":"123423",
"_id":{
"$oid":"5aba46c41c8d5e4b52462aeb"
},
"precooling":[
],
"subZone":[
]
}
],
"__v":0
}
推荐答案
您可以使用$redact
运算符:
db.buildings.aggregate([
{$match:{"zone.AHU":{$exists:true}}},
{$redact:{
$cond:{
if:{$or:[{$eq:["$AHU","C"]},{$not: "$AHU"}]},
then:"$$DESCEND",
else:"$$PRUNE"
}
}}
])
记住要包含{$not: "$AHU"}
很重要,这样就不会排除top元素.如果未添加,则将跳过top元素,因此将跳过整个嵌入式文档.
Remember {$not: "$AHU"}
is important to be included so that top element will not be excluded. If not added, top element will be skipped and hence skipping the entire embedded document.
输出:
{
"_id" : ObjectId("5aba4460a042dc4a2fdf26cd"),
"name" : "Test Street",
"coordinate" : [
12,
31
],
"yearlyEnergyCost" : 1444,
"zone" : [
{
"name" : "AHU-C-Z2",
"_id" : ObjectId("5aba4460a042dc4a2fdf26ce"),
"AHU" : "C",
"precooling" : [],
"subZone" : []
},
{
"name" : "AHU-C-Z1",
"AHU" : "C",
"_id" : ObjectId("5ac09c898249affa03506eff"),
"precooling" : [],
"subZone" : []
},
{
"name" : "AHU-C-Z3",
"AHU" : "C",
"_id" : ObjectId("5ac09c898249affa03506efe"),
"precooling" : [],
"subZone" : []
}
],
"__v" : 2
}
这篇关于在MongoDB集合中的对象数组中检索多个查询的元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!