【问题标题】:How to get child document from a collection in mondodb? [duplicate]如何从 mongodb 的集合中获取子文档? [复制]
【发布时间】:2016-10-21 16:40:46
【问题描述】:

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

这是我的文件:

{
    "_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

【问题讨论】:

    标签: mongodb mongoose aggregation-framework


    【解决方案1】:

    要过滤数组元素,需要执行$elemMatch 查询projection 阶段。请看下面的例子:

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

    【讨论】:

    • 它有效。谢谢你:)
    • 注意:- 这只会返回数组中的第一个匹配对象。如果有多个,您将无法全部获得。
    【解决方案2】:

    您可以使用$filteraggregate-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" }
        }
    }])
    

    【讨论】:

    • @Shrebanee 我运行了上面的查询但给了我错误uncaught exception: aggregate failed: { "errmsg" : "exception: invalid operator '$filter'", "code" : 15999, "ok" : 0 }
    • 为什么要在这里聚合?是用来杀死小苍蝇的霰弹枪 :-),
    • @profesor79 我想,如果数组中有多个对象,匹配查询,投影所有这些对象可以通过聚合来完成。
    • @AnuranjanPandey 忘了说,这只能用于 mongodb 3.2.x 版本。你用的是什么版本?
    • @AnuranjanPandey 用可以帮助您的查询编辑了我的答案。
    猜你喜欢
    • 2021-07-06
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    相关资源
    最近更新 更多