这是我的示例文档结构 {
id: "abc"
config: [
{
feature_id: f1,
properties: [
{
id: 1
todo: "check the microwave"
}
{
id: 2
todo: "check the food"
}
]
},
{
feature_id: f2,
}
]
}
我正在使用mongoDb聚合函数来基于todo
获取feature_id
。
试过多个解决方案,但似乎失败了
db.getCollection('foo').aggregate([
{$match: {
"id": "abc",
"config": {
$elemMatch: {
"feature_id": "f1"
}
}
}
},
{
$project : { "config": 1, "_id": 0}
},
{
$unwind: "$configurations"
},
]);
虽然我得到了结果,但它远非令人满意。
预期产出
[{id: 1 , todo: "check the microwave" }]
答案 0 :(得分:1)
您可以使用3.4中的任何以下聚合查询。
db.getCollection('foo').aggregate([
{"$match":{"id":"abc","config.feature_id":"f1"}},
{"$unwind":"$config"},
{"$match":{"config.feature_id":"f1"}},
{"$unwind":"$config.properties"},
{"$match":{"config.properties.id":1}},
{"$project":{"data":"$config.properties"}},
{"$replaceRoot":{"newRoot":"$data"}}
])
OR
db.getCollection('foo').aggregate([
{"$match":{"id":"abc","config.feature_id":"f1"}},
{"$project":{
"property":{
"$arrayElemAt":[
{"$filter":{
"input":{
"$let":{
"vars":{
"config":{
"$arrayElemAt":[
{"$filter":{
"input":"$config",
"as":"cf",
"cond":{"$eq":["$$cf.feature_id","f1"]}
}},
0
]
}
},
"in":"$$config.properties"
}
},
"as":"pf",
"cond":{"$eq":["$$pf.id",1]}
}},0]}
}},
{"$replaceRoot":{"newRoot":"$property"}}
])
答案 1 :(得分:0)
这是另一种解决方案
transport_first(std::mbegin(coll), std::back_inserter(vec));