2014-09-23 100 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