【问题标题】:How to retrieve object values with same key inside an array如何在数组中检索具有相同键的对象值
【发布时间】:2019-11-03 03:18:04
【问题描述】:

我正在尝试从文档数组中获取(过滤)与相同键匹配的所有对象。

文档架构示例:

{
    ...
    country: "ES",
    aut_comms: 
    [
        ...
        {name: "Aragon", province: "Huesca"},
        {name: "Aragon", province: "Teruel"},
        {name: "Aragon", province: "Zaragoza"},
        {name: "Madrid", province: "Madrid"}
        ...
    ]
}

如果可能的话,我只想从查询中检索与相同键匹配的对象中的值。导致组成如下的数组:["Huesca", "Teruel", "Zaragoza"]

与过滤器匹配的对象数组也可以解决问题:

[
    {name: "Aragon", province: "Huesca"},
    {name: "Aragon", province: "Teruel"},
    {name: "Aragon", province: "Zaragoza"}
]

感谢

【问题讨论】:

    标签: mongodb mongo-shell


    【解决方案1】:

    您将能够通过首先unwinding 数组然后对其进行操作来获取此数组

        db.demo.aggregate([
            {
                $unwind:"$aut_comms"
            },
            {
                $match:{"aut_comms.name":"Aragon"}
            },
            {
                $group:{
                    _id:null,
                    result: {$push:"$aut_comms.province"}
                }
            }
       ])
    

    【讨论】:

    • 非常感谢,这完成了我所需要的:)))
    【解决方案2】:

    编辑

    确实可以以您期望的格式进行此类查询和输出。您可以先执行$unwind$match。就个人而言,我更喜欢先执行$match,因为它会限制$unwind 操作生成的(不必要的)文档的数量。

    db.getCollection('col').aggregate([
        {$match: {"aut_comms.name": "Aragon"}},
        {$project: {_id: 0, "aut_comms": 1}},
        {$unwind: "$aut_comms"},
        {$match: {"aut_comms.name": "Aragon"}},
        {$project: {"province": "$aut_comms.province"}},
        {$group: {
            _id: null,
            province: {$push: "$province"}
        }}
    ])
    

    输出将是:

    /* 1 */
    {
        "_id" : null,
        "province" : [ 
            "Huesca", 
            "Teruel", 
            "Zaragoza"
        ]
    }
    

    【讨论】:

    • 这与只进行查找操作然后进行投影相同,这不会产生 OP 想要的数组
    • 试过这个,但它给我带来了整个 aut_comms 数组。仍然没有按 name 过滤。谢谢4你的帮助:)
    • @inikulin 我已将答案更新为您预期的格式。
    • @Andyk。谢谢队友,你的回答都很棒:)))
    猜你喜欢
    • 2021-12-10
    • 2022-01-11
    • 2018-12-07
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多