查找嵌套数组 mongodb
Finding nested array mongodb
所以我有一个 mongodb 文档,如下所示:
[
{
"_id": "04",
"name": "test service 4",
"id": "04",
"version": "0.0.1",
"title": "testing",
"description": "test",
"protocol": "test",
"operations": [
{
"_id": "99",
"oName": "test op 52222222222",
"sid": "04",
"name": "test op 52222222222",
"oid": "99",
"description": "testing",
"returntype": "test",
"parameters": [
{
"oName": "Param1",
"name": "Param1",
"pid": "011",
"type": "582",
"description": "testing",
"value": ""
},
{
"oName": "Param2",
"name": "Param2",
"pid": "012",
"type": "58222",
"description": "testing",
"value": ""
}
]
}
]
}
]
我希望能够找到所有参数和一个单独的参数,但我不完全确定如何使用此参数:
collection.find({operations: {$elemMatch: {oid: oid}}}, {"operations.$.parameters": 1}).toArray(function(error, result) {
if (error) {
console.log('Error retrieving parameter: ' + error);
res.send({'error':'An error has occurred'});
} else {
// console.log(result);
res.send(result);
}
});
我得到的输出是这样的:
[
{
"_id": "04",
"operations": [
{
"_id": "99",
"oName": "test op 52222222222",
"sid": "04",
"name": "test op 52222222222",
"oid": "99",
"description": "testing",
"returntype": "test",
"parameters": [
{
"oName": "Param1",
"name": "Param1",
"pid": "011",
"type": "582",
"description": "testing",
"value": ""
}
]
}
]
}
]
尽管我唯一想要的是单个参数。有什么办法可以完成吗?
您可以为此使用 aggregation framework
:
var oid = "99",
pipeline = [
{
$match: {
"operations.oid": oid
}
},
{
$unwind: "$operations"
},
{
$match: {
"operations.oid": oid
}
},
{
$unwind: "$operations.parameters"
},
{
$project: {
"parameters": "$operations.parameters"
}
}
];
collection.aggregate(pipeline).toArray(function(error, result) {
if (error) {
console.log('Error retrieving parameter: ' + error);
res.send({'error':'An error has occurred'});
} else {
// console.log(result);
res.send(result);
}
});
输出:
[
{
"_id" : "04",
"parameters" : {
"oName" : "Param1",
"name" : "Param1",
"pid" : "011",
"type" : "582",
"description" : "testing",
"value" : ""
}
},
{
"_id" : "04",
"parameters" : {
"oName" : "Param2",
"name" : "Param2",
"pid" : "012",
"type" : "58222",
"description" : "testing",
"value" : ""
}
}
]
编辑:
要访问给定 pid
值的单个参数,您可以通过添加 $match
pipeline stage between the $unwind
and $project
阶段来修改管道,以便您可以过滤文档以 return 参数对象匹配pid
:
var oid = "99",
pid = "011",
pipeline = [
{
$match: {
"operations.oid": oid
}
},
{
$unwind: "$operations"
},
{
$match: {
"operations.oid": oid
}
},
{
$unwind: "$operations.parameters"
},
// This pipeline stage returns the individual parameters object that matches the given pid value
{
$match: { "operations.parameters.pid": pid }
},
{
$project: {
"parameters": "$operations.parameters"
}
}
];
输出:
[
{
"_id" : "04",
"parameters" : {
"oName" : "Param1",
"name" : "Param1",
"pid" : "011",
"type" : "582",
"description" : "testing",
"value" : ""
}
}
]
所以我有一个 mongodb 文档,如下所示:
[
{
"_id": "04",
"name": "test service 4",
"id": "04",
"version": "0.0.1",
"title": "testing",
"description": "test",
"protocol": "test",
"operations": [
{
"_id": "99",
"oName": "test op 52222222222",
"sid": "04",
"name": "test op 52222222222",
"oid": "99",
"description": "testing",
"returntype": "test",
"parameters": [
{
"oName": "Param1",
"name": "Param1",
"pid": "011",
"type": "582",
"description": "testing",
"value": ""
},
{
"oName": "Param2",
"name": "Param2",
"pid": "012",
"type": "58222",
"description": "testing",
"value": ""
}
]
}
]
}
]
我希望能够找到所有参数和一个单独的参数,但我不完全确定如何使用此参数:
collection.find({operations: {$elemMatch: {oid: oid}}}, {"operations.$.parameters": 1}).toArray(function(error, result) {
if (error) {
console.log('Error retrieving parameter: ' + error);
res.send({'error':'An error has occurred'});
} else {
// console.log(result);
res.send(result);
}
});
我得到的输出是这样的:
[
{
"_id": "04",
"operations": [
{
"_id": "99",
"oName": "test op 52222222222",
"sid": "04",
"name": "test op 52222222222",
"oid": "99",
"description": "testing",
"returntype": "test",
"parameters": [
{
"oName": "Param1",
"name": "Param1",
"pid": "011",
"type": "582",
"description": "testing",
"value": ""
}
]
}
]
}
]
尽管我唯一想要的是单个参数。有什么办法可以完成吗?
您可以为此使用 aggregation framework
:
var oid = "99",
pipeline = [
{
$match: {
"operations.oid": oid
}
},
{
$unwind: "$operations"
},
{
$match: {
"operations.oid": oid
}
},
{
$unwind: "$operations.parameters"
},
{
$project: {
"parameters": "$operations.parameters"
}
}
];
collection.aggregate(pipeline).toArray(function(error, result) {
if (error) {
console.log('Error retrieving parameter: ' + error);
res.send({'error':'An error has occurred'});
} else {
// console.log(result);
res.send(result);
}
});
输出:
[
{
"_id" : "04",
"parameters" : {
"oName" : "Param1",
"name" : "Param1",
"pid" : "011",
"type" : "582",
"description" : "testing",
"value" : ""
}
},
{
"_id" : "04",
"parameters" : {
"oName" : "Param2",
"name" : "Param2",
"pid" : "012",
"type" : "58222",
"description" : "testing",
"value" : ""
}
}
]
编辑:
要访问给定 pid
值的单个参数,您可以通过添加 $match
pipeline stage between the $unwind
and $project
阶段来修改管道,以便您可以过滤文档以 return 参数对象匹配pid
:
var oid = "99",
pid = "011",
pipeline = [
{
$match: {
"operations.oid": oid
}
},
{
$unwind: "$operations"
},
{
$match: {
"operations.oid": oid
}
},
{
$unwind: "$operations.parameters"
},
// This pipeline stage returns the individual parameters object that matches the given pid value
{
$match: { "operations.parameters.pid": pid }
},
{
$project: {
"parameters": "$operations.parameters"
}
}
];
输出:
[
{
"_id" : "04",
"parameters" : {
"oName" : "Param1",
"name" : "Param1",
"pid" : "011",
"type" : "582",
"description" : "testing",
"value" : ""
}
}
]