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

Mongodb 如何从mondodb中的集合中获取子文档?,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我创建了一个包含子集合数据的集合。我想用一个键从子集合中筛选 这是我的文件: { "_id" : ObjectId("5758098356e3930537af15dd"), "manpower_data" : [ { "_id" : ObjectId("5758098356e3930537af15de"), "created" : ISODate("2016-06-08T12:03:15.387Z"),

我创建了一个包含子集合数据的集合。我想用一个键从子集合中筛选

这是我的文件:

{
    "_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”})


它将返回所有两个子文档,但我只想获取那些具有匹配的
dealerCodeFor
manpower data
要过滤数组元素,需要执行带有
$elemMatch
的查询
投影
阶段。请参见下面的示例:

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

要过滤数组元素,需要使用
$elemMatch
执行查询
投影
阶段。请参见下面的示例:

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

您可以使用
aggregate mongodb
$filter
来实现这一点

请尝试以下操作:-

db.collection.aggregate([
{ 
    "$match": {"manpower_data.dealerCodeFor":"ZSAE876"}
},
{
    "$project": {
        "manpower_data": {
            "$filter": {
                "input": "$manpower_data",
                "as": "o",
                "cond": {  
                    "$eq": ["$$o.dealerCodeFor", "ZSAE876"]
                }
            }
        }
    }
}])
通过运行上述查询,
manpower\u 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" }
    }
}])

您可以使用
aggregate mongodb
$filter
来实现这一点

请尝试以下操作:-

db.collection.aggregate([
{ 
    "$match": {"manpower_data.dealerCodeFor":"ZSAE876"}
},
{
    "$project": {
        "manpower_data": {
            "$filter": {
                "input": "$manpower_data",
                "as": "o",
                "cond": {  
                    "$eq": ["$$o.dealerCodeFor", "ZSAE876"]
                }
            }
        }
    }
}])
通过运行上述查询,
manpower\u 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" }
    }
}])

@Shrebanee我运行了上面的查询,但给了我错误
uncaught异常:聚合失败:{“errmsg”:“异常:无效运算符'$filter'”,“代码”:15999,“确定”:0}
为什么在这里聚合?是一把猎枪,可以杀死一只小苍蝇:-),@profesor79我想,如果数组中有多个对象,匹配查询,投射所有这些对象都可以通过聚合完成。@AnuranjanPandey忘了提到,这只能用于mongodb 3.2.x版。您正在使用的版本是什么?@AnuranjanPandey编辑了我的答案,并使用了可以帮助您的查询。@Shrebanee我运行了上述查询,但给了我错误
uncaught异常:聚合失败:{“errmsg”:“异常:无效运算符'$filter'”,“代码”:15999,“确定”:0}
为什么在这里聚合?是一把猎枪,可以杀死一只小苍蝇:-),@profesor79我想,如果数组中有多个对象,匹配查询,投射所有这些对象都可以通过聚合完成。@AnuranjanPandey忘了提到,这只能用于mongodb 3.2.x版。你使用的版本是什么?@AnuranjanPandey用一个可以帮助你的查询编辑了我的答案。它很有效。谢谢:)注意:-这将只返回数组中的第一个匹配对象。如果有多个,你不会得到所有的。这是有效的。谢谢:)注意:-这将只返回数组中的第一个匹配对象。如果有多个,你不会得到所有的。