【问题标题】:Get closest locations in an Array获取数组中最近的位置
【发布时间】:2017-03-06 15:31:05
【问题描述】:

我有一个简单的文档,它在一个数组中有 3 个位置对象。

数据:

{
    "_id" : ObjectId("57c3c479a306b3613cf1ee5b"),
    "location_history" : [ 
        {
            "location_name" : "Area 1",
            "date" : 1472447609,
            "_id" : ObjectId("57c3c479ac5a69612f0e0899"),
            "location" : [ 
               24.9532107, 67.1790576
            ]
        }, 
        {
            "location_name" : "Area 2",
            "date" : 1472448059,
            "_id" : ObjectId("57c3c63bac5a69612f0e089c"),
            "location" : [ 
               24.9663937, 67.1462044
            ]
        }, 
        {
            "location_name" : "Area 3",
            "date" : 1472448987,
            "_id" : ObjectId("57c3c9dbac5a69612f0e08a0"),
            "location" : [ 
               -24.987325, 115.1862298
            ]
        } 
}

问题:我需要获取此数组中最近的位置。

我尝试过的查询:

db.getCollection('consumers_locations').aggregate([
    {"$unwind": "$location_history"},
    {"$match":{"_id":ObjectId("57c3c479a306b3613cf1ee5b")}},
    {"$project" : { "abc" : "$location_history.location"} },
    { $geoNear: {
        near: { type: "Point", coordinates: [ 24.942785, 67.157855 ] },
        distanceField: "distance",
        query : {"_id" : "_id"},
        uniqueDocs: true,
        includeLocs: "search_history.location",
        maxDistance : 10000
      }
    }
])

但我得到一个错误:

"ok" : 0,
"errmsg" : "$geoNear is only valid as the first stage in a pipeline.",
"code" : 2,
"codeName" : "BadValue"

预期输出:

{
    "_id" : ObjectId("57c3c479a306b3613cf1ee5b"),
    "location_history" : [ 
        {
            "location_name" : "Area 1",
            "date" : 1472447609,
            "_id" : ObjectId("57c3c479ac5a69612f0e0899"),
            "location" : [ 
               24.9532107, 67.1790576
            ]
        }, 
        {
            "location_name" : "Area 2",
            "date" : 1472448059,
            "_id" : ObjectId("57c3c63bac5a69612f0e089c"),
            "location" : [ 
               24.9663937, 67.1462044
            ]
        }
}

【问题讨论】:

    标签: javascript mongodb geolocation aggregation-framework


    【解决方案1】:

    这不适用于您的架构。索引用于对集合中的文档进行排序,而不是对文档中的子文档进行排序。

    考虑创建一个单独的location_history 集合,其中引用了consumers_locations 中的父文档。例如。对于您的对象,集合可能如下所示:

    db.getCollection('location_history').insert([
            {
                "consumer_location": ObjectId("57c3c479a306b3613cf1ee5b"),
                "location_name" : "Area 1",
                "date" : 1472447609,
                "_id" : ObjectId("57c3c479ac5a69612f0e0899"),
                "location" : [ 
                   24.9532107, 67.1790576
                ]
            }, 
            {
                "consumer_location": ObjectId("57c3c479a306b3613cf1ee5b"),
                "location_name" : "Area 2",
                "date" : 1472448059,
                "_id" : ObjectId("57c3c63bac5a69612f0e089c"),
                "location" : [ 
                   24.9663937, 67.1462044
                ]
            }, 
            {
                "consumer_location": ObjectId("57c3c479a306b3613cf1ee5b"),
                "location_name" : "Area 3",
                "date" : 1472448987,
                "_id" : ObjectId("57c3c9dbac5a69612f0e08a0"),
                "location" : [ 
                   -24.987325, 115.1862298
                ]
            } 
    ]);
    

    关于错误,the docs阅读:

    您只能将 $geoNear 用作管道的第一阶段。

    因为只有第一阶段可以从索引中受益。

    【讨论】:

    • 模式的改变将是一个很大的改变,我把它作为我要做的最后一件事。难道没有别的办法了吗? Stored JavaScript 之类的东西或其他任何东西?
    • 但这会使数据变得多余@Alex Blex
    猜你喜欢
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2020-11-06
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    相关资源
    最近更新 更多