2014-09-23 94 views
0

我需要修改现有的地理空间查询,以便它包含搜索结果中的距离。 (文档和现有查询都使用传统坐标对。)原始查询使用$ near。读取MongoDB文档,看起来像geoNear应该返回距离,如几个示例所示。MongoDB:geoNear没有返回距离

尽管我已经能够修改查询以使用geoNear,但搜索结果中不包含距离。这是新的查询的示例:

{ 
    geoNear: 'users', 
    near: [ '0', '0' ], 
    maxDistance: '90', 
    query: { userName: { '$regex': '^test' } } 
} 

有一件事我不明白是怎么蒙哥捆绑的位置在查询到的文档的位置指定。在我的情况下,用户文档有一个名为lastKnownPosition的字段。 Mongo甚至知道如何查询该领域?

下面是搜索结果的一个例子:

{ 
    "__v" : 0 , 
    "_id" : { "$oid" : "5413824f8b4d6f7505120a53"} , 
    "lastKnownPosition" : { "lon" : 0 , "lat" : 0} ", 
    "userName" : "test123" 
} 
+0

什么结果你回来还是会给你一个错误? – 2014-09-23 17:58:42

+0

我找回用户列表。我会用结果更新我的帖子。 – attila226 2014-09-23 18:03:10

+0

有没有机会从您的收藏中抽取几份文件的样本? – 2014-09-24 05:38:14

回答

0

我想不出哪里会不退还的距离单宗。所以,你必须做不同的东西如何此示例中表示:

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“并且通过调用中的"geoNear"命令与文档分开,或者被指定并且包括在来自聚合$geoNear运营商的文档中。

按照任何这些模式,你会得到你想要的结果。

+0

我像示例中所示的那样通过Mongoose添加了索引,并且当我在uMongo中查看文档时显示了新的索引。但是,由于某种原因,我仍然没有得到结果的距离。我可以提供哪些其他信息对您有帮助? – attila226 2014-09-24 20:20:55

+0

@ attila226完整地运行该示例,这是该列表的设计目的。关键是代码中的某些内容与此不同,这就是为什么事情不起作用。如果索引不存在,查询就根本不起作用,因此不是该部分。 – 2014-09-24 23:22:28