如何在Mongodb中返回符合给定条件的子文档数组
How to return an array of subdocuments that match a given criteria in Mongodb?
给定一个集合,如:
{
"_id": "XXXX",
"JobId": [
100
],
"PersonalDetails": [
{
"Level": 1,
"Zone": [
{
"Id": 1,
"Code": "XXXXXXXX",
"IsAvailable": true
},
{
"Id": 45,
"Code": "ZZZZZZZZZ",
"IsAvailable": false
}
]
}
],
"Timestamp": ISODate("2015-11-01T00:00:00.000Z")
}
我需要获取所有将IsAvailable标志设置为true的区域ID和代码。
我尝试过以下几种:
var details = db.test.find(
{
JobId: {$in: [100]},
'PersonalDetails': {$elemMatch: {Zone : {$elemMatch: {IsAvailable: true}}}}
},
{
'PersonalDetails.Zone.Id': 1,
'PersonalDetails.Zone.Code': 1,
'PersonalDetails.Zone.IsAvailable': 1
});
details.forEach(function(doc){
var myDetails = doc.PersonalDetails;
myDetails.forEach(function(doc2){
var myZones = doc2.Zone;
print(myZones);
这给了我
{
"0" : {
"Id": 1,
"Code": "XXXXXXXX",
"IsAvailable": true
},
"1" : {
"Id": 45,
"Code": "ZZZZZZZZZ",
"IsAvailable": false
}
}
但我只想在IsAvailable标志设置为true的地方返回。
我是不是搞错了??我尝试使用聚合,但遇到了同样的问题——返回all而不筛选IsAvailable标志。
您需要使用.aggregate()
方法。
首先,您需要减小要使用$match
运算符处理的文档的大小。从那里,您将需要使用$unwind
运算符来取消"PersonalDetails"数组的规范化。
然后,您可以使用$project
运算符只返回符合条件的子文档。
项目阶段的$map
运算符用于返回子文档的数组。
db.collection.aggregate([
{ "$match": {
"JobId": 100,
"PersonalDetails.Zone.IsAvailable": true
}},
{ "$unwind": "$PersonalDetails" },
{ "$project": {
"zone": {
"$setDifference": [
{ "$map": {
"input": "$PersonalDetails.Zone",
"as": "z",
"in": { "$cond": [ "$$z.IsAvailable", "$$z", false ] }
}},
[false]
]
}
}}
])
哪个返回:
{
"_id" : "XXXX",
"zone" : [
{
"Id" : 1,
"Code" : "XXXXXXXX",
"IsAvailable" : true
}
]
}
从MongoDB 3.2开始,我们可以使用$filter
操作符来高效地完成
db.collection.aggregate([
{ "$match": {
"JobId": 100,
"PersonalDetails.Zone.IsAvailable": true
}},
{ "$unwind": "$PersonalDetails" },
{ "$project": {
"zone": {
"$filter": {
"input": "$PersonalDetails.Zone",
"as": "z", "cond": "$$z.IsAvailable"
}
}
}}
])
相关文章:
- 为什么typeof的数组的数组的未定义值返回为“0”;未定义的“;我的条件不认为是真的
- Javascript'数组'和'循环'如何“;变量[i]”;是一个条件
- 从json数组中查找满足条件的特定元素的值
- 使用条件for循环更新数组-Javascript
- 根据条件将函数放入数组中(如果选中复选框)
- Javascript-在一个数组中搜索整个单词,并创建一个符合条件的新数组
- 根据某些条件验证用户输入,而不是将输入输入到数组中,需要最基本的解决方案
- Javascript :基于数组的条件循环
- 根据条件 JavaScript 在父级下对类似的数组项进行分组
- 比较数组并使用条件对数组列表进行排序
- 从 JSON 对象数组中获取与条件匹配的文档
- if数组元素在for循环内部有条件
- 带条件的多维数组中的javascript和数组值
- 使用restangular从json对象数组中获取具有特定条件的json对象
- 使用handlers.js模板以数组中的最后一项为条件
- 根据条件从数组中删除对象
- 根据JavaScript中的条件将对象拆分为对象数组
- 使用具有特定条件的 lodash 添加和组合对象数组中的重复项
- 根据某些条件将 JS 绑定到可观察对象内的数组元素
- 将数组的至少“N”个元素与条件列表匹配