Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取阵列中最近的位置_Javascript_Mongodb_Geolocation_Aggregation Framework - Fatal编程技术网

Javascript 获取阵列中最近的位置

Javascript 获取阵列中最近的位置,javascript,mongodb,geolocation,aggregation-framework,Javascript,Mongodb,Geolocation,Aggregation Framework,我有一个简单的文档,它在一个数组中有3个位置对象 数据: { "_id" : ObjectId("57c3c479a306b3613cf1ee5b"), "location_history" : [ { "location_name" : "Area 1", "date" : 1472447609, "_id" : ObjectId("57c3c479ac5a69612f0e0899"),

我有一个简单的文档,它在一个数组中有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
      }
    }
])
{
    "_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
            ]
        }
}
问题:我需要获取此数组中最近的位置

我尝试过的查询:

{
    "_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
      }
    }
])
{
    "_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
            ]
        }
}
但我得到一个错误:

{
    "_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
      }
    }
])
{
    "_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
            ]
        }
}
预期输出:

{
    "_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
      }
    }
])
{
    "_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\u历史记录
集合,其中引用了
consumers\u 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
            ]
        } 
]);
关于错误,请阅读:

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


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

模式的更改将是一个很大的更改,我将它作为最后一件事保留下来。没有别的办法吗?类似于
存储的JavaScript
或任何其他东西?但它会使数据冗余@Alex Blex