从mongo聚合函数

时间:2018-03-02 23:35:31

标签: mongodb aggregation-framework

这是我的示例文档结构     {

    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" }]

2 个答案:

答案 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));