gpt4 book ai didi

javascript - 如何返回符合 Mongodb 给定条件的子文档数组?

转载 作者:可可西里 更新时间:2023-11-01 09:35:35 26 4
gpt4 key购买 nike

给定一个集合,例如:

{
"_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 的地方。

我是不是用错了方法??我尝试使用聚合但遇到了同样的问题 - 返回所有而不过滤 IsAvailable 标志。

最佳答案

您需要使用 .aggregate()方法。

首先,您需要使用 $match 减小要处理的文档的大小运算符(operator)。从那里您需要使用 $unwind 对“PersonalDetails”数组进行非规范化。运算符(operator)。

然后您可以使用 $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"
}
}
}}
])

关于javascript - 如何返回符合 Mongodb 给定条件的子文档数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33737657/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com