【问题标题】:MongoDB querying inside an array of objectsMongoDB在对象数组中查询
【发布时间】:2020-01-02 14:31:52
【问题描述】:

我对 MongoDB 很陌生,只对 MySQL 和数据库有经验。

我在 MongoDB 中有这个文档:

{
"type": "table",
"name": "pd_locations",
"database": "boatie_db",
"data": [{
    "location_id": "1",
    "name": "Ved slusen (Sluseholmen)",
    "latitude": "12.55013600",
    "longitude": "55.64845000",
    "time_from_slus": "0"
}, {
    "location_id": "2",
    "name": "Fisketorvet",
    "latitude": "12.56373800",
    "longitude": "55.66334900",
    "time_from_slus": "30"
}, {
    "location_id": "3",
    "name": "Kayak Bar",
    "latitude": "12.58679700",
    "longitude": "55.67547700",
    "time_from_slus": "35"
}, {
    "location_id": "4",
    "name": "Reffen",
    "latitude": "12.60740800",
    "longitude": "55.69375000",
    "time_from_slus": "60"
}, {
    "location_id": "5",
    "name": "Nordhavn bassin v. sandkaj",
    "latitude": "12.59589800",
    "longitude": "55.70640400",
    "time_from_slus": "75"
}]}

如果可能的话,我正在尝试进行查询,因此我只能通过位置 ID 获取一个特定对象,该对象已经在对象内部。

例如,如果我要求 location_id: 1,我希望它返回:

{"location_id": "1",
"name": "Ved slusen (Sluseholmen)",
"latitude": "12.55013600",
"longitude": "55.64845000",
"time_from_slus": "0"}

和/或没有 ID

{"name": "Ved slusen (Sluseholmen)",
"latitude": "12.55013600",
"longitude": "55.64845000",
"time_from_slus": "0"}

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    是的,可以,使用$elemMatch

    db.collection.find(
        {
            // query to match your on object
        },
        {
            data: {
                $elemMatch: {
                    location_id: "1"
                }
            }
        }
    );
    

    编辑:

    据我所知,对于进一步的结构操作,您必须使用聚合管道。

    db.collection.aggregate([
        {
            $match: {
                // your match query
            }
        },
        {
            $project: {
                data: {
                    $map: {
                        input: {$filter: {input: "$data", as: "d", cond: {$eq: ["$$d.location_id", "1"]}}},
                        as: "d",
                        in: "$$d.name"
                    }
                }
            }
        }
    ]);
    

    【讨论】:

    • 非常感谢您的快速回答。如果我需要从特定 id 返回名称怎么办?就像我有 location_id: 1,我只想从对象返回名称?
    • 编辑了我的答案,对于这种情况,我认为你必须使用聚合。
    【解决方案2】:
    db.collection.aggregate(
    
        // Pipeline
        [
            // Stage 1
            {
                $project: {
                    data: {
                        $filter: {
                            input: "$data",
                            as: "data",
                            cond: {
                                $eq: ["$$data.location_id", "1"]
                            }
                        }
                    }
                }
            },
    
        ]
    
    
    
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 2012-05-05
      • 2014-05-13
      • 2018-07-23
      • 1970-01-01
      • 2020-03-28
      • 2018-11-01
      相关资源
      最近更新 更多