2014-03-29 38 views
2

我收藏有一個像下面的字段,存儲用戶簽入(地理座標)MongoDB的geoNear與獨特和排序的值

{ 
    "_id" : ObjectId("5333c3063b15ea390b3c986a"), 
    "userID" : "5332cad33b15eaaf643c986a",  
    "timestamp" : ISODate("2014-03-27T06:19:50.129Z"), 
    "loc" : { 
      "type" : "Point", 
      "coordinates" : [ 
        76.980286, 
        10.934041 
      ] 
    } 
    } 
{ 
    "_id" : ObjectId("53353a0d3b15ea063a3c986a"), 
    "userID" : "533268983b15ea9f5a3c986c",   
    "timestamp" : ISODate("2014-03-28T08:59:57.907Z"), 
    "loc" : { 
      "type" : "Point", 
      "coordinates" : [ 
        76.980019, 
        10.934072 
      ] 
    } 
} 
{ 
    "_id" : ObjectId("53353a5d3b15eacc393c986c"), 
    "userID" : "533268983b15ea9f5a3c986c",   
    "timestamp" : ISODate("2014-03-28T09:01:17.479Z"), 
    "loc" : { 
      "type" : "Point", 
      "coordinates" : [ 
        76.980057, 
        10.933996 
      ] 
    } 
} 

我使用geoNear來計算距離。 結果應該是最新的用戶簽到(地理座標),即某種基於時間戳以獲得最新的簽入,並基於用戶ID

我想下面的代碼,但明顯它不是幫助

db.runCommand( 
    { 
     "geoNear" : "locations", 
     "near" : [76.980286, 10.934041 ], 
     "num" : 100, 
     "spherical" : true, 
     "maxDistance" :1000, 
     "query" : { 
      "distinct" : { "userID" : true } , 
      "sort" : { "timestamp" : -1 } 
     } 
    } 
) 

告訴我我錯了!

+0

是否沒有**錯誤**給你一些指示? –

+0

沒有錯誤,但結果是空的。如果您嘗試刪除**查詢**選項。然後結果顯示重複的用戶ID(s)。謝謝 – rajeshkumarprk

+0

對於'runCommand'形式,這可能是正確的。但** distinct **和** sort **不是有效的查詢條件。也許你的意思是'uniqueDocs',而「GeoNear」的意思是返回「最接近的」,所以「排序」在這裏並不真正有效。您的查詢對象無法成爲查詢。請參閱[文檔](http://docs.mongodb.org/manual/reference/command/geoNear/) –

回答

1

再次在這個時候,您表裏如一想是.aggregate()形式,因爲2.4版本已被查閱:

db.users.aggregate([ 
    { "$geoNear": { 
      "near" : [76.980286, 10.934041 ], 
      "num" : 100, 
      "spherical" : true, 
      "maxDistance" :1000, 
      "distanceField": "calculated" 
    }}, 
    { "$sort": { "timestamp": -1, "calculated": 1 } }, 
    { "$group": { 
     "_id": "$userID", 
     "loc": { "$first": "$loc" }, 
     "calculated": { "$first": "$calculated" } 
    }}, 
]) 

那麼這樣做是使用$geoNear運營商聚集以便根據「地理索引」在這裏「投射」「距離場」。那麼你實際上似乎想要$sort這些結果,但邏輯要做的事情是「排序」的「時間戳」獲取最新值,然後通過「計算距離」作爲「最近」。

您的操作的最後一部分是您想要的「不同的」userID值。因此,您在此處使用$group來獲得結果,其中之後使用排序應該是在分組邊界上找到的$first項目。

因此,應該爲您提供基於「最新」timestamp值與給定位置「最接近」的「不同」用戶。

其中我認爲是你想要的。

+0

謝謝尼爾。但聚合使用比命令geoNear更多的內存,所以我修改了模式位。再次感謝。 – rajeshkumarprk