如何从mondodb中的集合中获取子文档?

时间:2016-06-20 12:11:07

标签: mongodb mongoose aggregation-framework

我创建了一个包含子集合数据的集合。我想用密钥过滤子集合。

这是我的文件:

{
    "_id" : ObjectId("5758098356e3930537af15dd"),
    "manpower_data" : [ 
        {
            "_id" : ObjectId("5758098356e3930537af15de"),
            "created" : ISODate("2016-06-08T12:03:15.387Z"),            
            "designation" : "Visiting Evaluator",            
            "evaluatorContactNumber" : "987654321",            
            "evaluatorName" : "Dumy User1",
            "dealerCodeFor" : "ZSAE876",
            "region" : "Gurgaon"
        }, 
        {
            "_id" : ObjectId("5758098356e3930537af15de"),
            "created" : ISODate("2016-06-08T12:03:15.387Z"),            
            "designation" : "Resident Evaluator",            
            "evaluatorContactNumber" : "987654321",            
            "evaluatorName" : "Dumy User2",
            "dealerCodeFor" : "ZSAE877",
            "region" : "Delhi"
        }
    ]
}

当我运行此查询时

db.mycollection.find({"manpower_data.dealerCodeFor":"ZSAE876"});

它返回了我所有的两个子文档,但我只想获得匹配manpower data的{​​{1}}。

2 个答案:

答案 0 :(得分:2)

要过滤数组元素,需要执行查询projection阶段$elemMatch。请参阅以下示例:

db.collection.find({
    "manpower_data.dealerCodeFor" : "ZSAE876"
}, {
    manpower_data : {
        $elemMatch : {
            dealerCodeFor : "ZSAE876"
        }
    }
})

答案 1 :(得分:2)

您可以使用$filter aggregate-mongodb来实现此目标。

请尝试以下方法: -

db.collection.aggregate([
{ 
    "$match": {"manpower_data.dealerCodeFor":"ZSAE876"}
},
{
    "$project": {
        "manpower_data": {
            "$filter": {
                "input": "$manpower_data",
                "as": "o",
                "cond": {  
                    "$eq": ["$$o.dealerCodeFor", "ZSAE876"]
                }
            }
        }
    }
}])

通过运行上述查询,manpower_data将仅返回符合您条件的对象。

编辑: -

对于小于2.6.x的版本,请尝试以下查询: -

db.collection.aggregate([
{ 
    "$match": {"manpower_data.dealerCodeFor":"ZSAE876"}
},  
{ "$unwind": "$manpower_data" },
{ 
    "$match": {"manpower_data.dealerCodeFor":"ZSAE876"}
},
{
    "$group": {
        "$_id": "$_id",
        "manpower_data": { "$push": "$manpower_data" }
    }
}])