Javascript MongoDB:geoNear不返回距离
我需要修改现有的地理空间查询,以便在搜索结果中包含距离。(文档和现有查询都使用传统坐标对。)原始查询使用$near。阅读MongoDB文档,geoNear似乎应该返回距离,如几个示例所示 虽然我可以修改查询以使用geoNear,但搜索结果中不包括距离。以下是新查询的示例:Javascript MongoDB:geoNear不返回距离,javascript,node.js,mongodb,mongoose,geospatial,Javascript,Node.js,Mongodb,Mongoose,Geospatial,我需要修改现有的地理空间查询,以便在搜索结果中包含距离。(文档和现有查询都使用传统坐标对。)原始查询使用$near。阅读MongoDB文档,geoNear似乎应该返回距离,如几个示例所示 虽然我可以修改查询以使用geoNear,但搜索结果中不包括距离。以下是新查询的示例: { geoNear: 'users', near: [ '0', '0' ], maxDistance: '90', query: { userName: { '$regex': '^test' } } }
{
geoNear: 'users',
near: [ '0', '0' ],
maxDistance: '90',
query: { userName: { '$regex': '^test' } }
}
我不清楚的一件事是Mongo如何将位置与查询中指定的位置关联到文档的位置。在我的例子中,用户文档有一个名为lastKnownPosition的字段。Mongo怎么知道对该字段进行查询
以下是搜索结果的示例:
{
"__v" : 0 ,
"_id" : { "$oid" : "5413824f8b4d6f7505120a53"} ,
"lastKnownPosition" : { "lon" : 0 , "lat" : 0} ",
"userName" : "test123"
}
我想不出有哪一种情况下距离是不会回来的。因此,您必须做一些与此示例中表示的不同的事情:
var async = require('async'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/test');
var geoSchema = new Schema({
"lastKnownPosition": {
"lon": Number,
"lat": Number
},
"userName": String
});
geoSchema.index({ "lastKnownPosition": "2d" });
var Geo = mongoose.model( "Geo", geoSchema, "testgeo" );
mongoose.connection.on("open", function(err,conn) {
async.series(
[
function(callback) {
Geo.remove({},function(err) {
callback();
});
},
function(callback) {
Geo.create(
{
"lastKnownPosition": { "lon": 0, "lat": 0 },
"userName": "test123"
},
function(err,doc) {
if (err) throw err;
callback();
}
);
},
// Mongoose method
function(callback) {
Geo.geoNear(
[0,0],
{
maxDistance: 90,
query: { 'userName': { '$regex': '^test' } }
},
function(err,docs) {
if (err) throw err;
console.log( docs );
callback();
});
},
// Native method
function(callback) {
Geo.db.db.executeDbCommand(
{
"geoNear": "testgeo",
"near": [ 0, 0 ],
"maxDistance": 90,
"query": { 'userName': /^test/ },
},function(err,result) {
if ( err ) throw err;
console.log( result.documents[0].results[0] );
callback();
}
);
},
// aggregate method
function(callback) {
Geo.aggregate(
[
{ "$geoNear": {
"near": [0,0],
"distanceField": "distance",
"maxDistance": 90,
"query": { "userName": { "$regex": "^test" } }
}}
],
function(err,result) {
if (err) throw err;
console.log( result );
callback();
}
);
}
],
function(err) {
mongoose.disconnect();
}
);
});
产生如下输出:
[ { dis: 0,
obj:
{ userName: 'test123',
__v: 0,
_id: 54225696ce2837e4495cd188,
lastKnownPosition: { lon: 0, lat: 0 } } } ]
{ dis: 0,
obj:
{ _id: 54225696ce2837e4495cd188,
userName: 'test123',
lastKnownPosition: { lon: 0, lat: 0 },
__v: 0 } }
[ { _id: 54225696ce2837e4495cd188,
userName: 'test123',
lastKnownPosition: { lon: 0, lat: 0 },
__v: 0,
distance: 0 } ]
它们都有一个“距离”字段,默认为“dis”,并通过调用中的命令或聚合操作符在文档中指定和包含的内容与文档分开
遵循这些模式中的任何一种,您都会得到想要的结果。每个集合只能创建一个2d索引,因此mongo直接知道要查询哪个字段
您得到的结果是什么,还是它给了您一个错误?我得到的是一个用户列表。我将用结果更新我的帖子。有没有可能从你的收藏中获得一些文档样本?我通过Mongoose添加了索引,如示例所示,当我在uMongo中查看文档时,会显示新的索引。然而,由于某些原因,我仍然无法在结果中获得距离。我还可以提供哪些有用的信息?@attila226完整地运行该示例,这就是清单的设计目的。关键是代码中的某些内容与此不同,这就是为什么事情不起作用的原因。如果索引不存在,那么查询将根本不起作用,因此这不是部分。索引以前不存在,所以我添加了它。然而,结果中仍然没有提到距离。