簡體   English   中英

Query.Near的maxDistance參數不起作用

[英]maxDistance parameter of Query.Near not working

我正在使用MongoDB的C#驅動程序,並試圖獲取Query.Near,以便在距中心點5、10、25或50英里的范圍內返還待售房屋。 這是查詢:

var near = Query.Near("Coordinates", coordinates.Latitude, coordinates.Longitude, find.GetRadiansAway(), false);
    //var near = Query.WithinCircle("Coordinates", coordinates.Latitude, coordinates.Longitude, find.GetRadiansAway(), false);
    var query = Collection().Find(near);
    query.Limit = 1000;
    var listings = query.ToList();

我將英里半徑除以62.1868289以獲取弧度並將其輸入到查詢中,但是無論我傳遞什么弧度值,它都會返回相同數量的待售房屋。我還嘗試將球面參數設置為true和使用Query.WithinCircle,但是效果都不佳。

我正在使用最新的C#驅動程序(1.0.0.4098),這是C#驅動程序中的錯誤,還是MongoDB中的錯誤,還是我在這里錯過了一些東西?

這是查詢的樣子:

5英里遠(在附近):

db.Listing.find({ "Coordinates" : { "$near" : [39.4812172, -76.6438598], "$maxDistance" : 0.072463768115942032 } });

10英里遠(在附近):

db.Listing.find({ "Coordinates" : { "$near" : [39.4812172, -76.6438598], "$maxDistance" : 0.14492753623188406 } });

5英里遠(球面附近):

db.Listing.find({ "Coordinates" : { "$nearSphere" : [39.4812172, -76.6438598], "$maxDistance" : 0.0012629451881788331 } });

10英里遠(球面附近):

db.Listing.find({ "Coordinates" : { "$nearSphere" : [39.4812172, -76.6438598], "$maxDistance" : 0.0025258903763576662 } });

無論我通過5英里還是25英里,這都是我的測試用例,它返回相同的結果數:

[Test]
        public void NearTest()
        {
            var isSpherical = true;
            var latitude = 39.4812172;
            var longitude = -76.6438598;
            var milesAway = 5;
            var distance = milesAway / (isSpherical ? 3959.0 : 69.0);

            //search within 5 miles.
            var near = Query.Near("Coordinates", latitude, longitude, distance, isSpherical);
            var collection = ContextWorker.Database.GetCollection<Schemas.Listing.Listing>("Listing");
            var query = collection.Find(near);
            query.Limit = 1000;
            var listings = query.ToList();
            var count1 = listings.Count;
            //Console.WriteLine("query: {0}", query.ToJson());
            Console.WriteLine(count1 + " results returned that are " + milesAway + " miles away");

            //search within 25 miles.
            milesAway = 25;
            distance = milesAway / (isSpherical ? 3959.0 : 69.0);
            near = Query.Near("Coordinates", latitude, longitude, distance, isSpherical);
            query = collection.Find(near);
            query.Limit = 1000;
            listings = query.ToList();
            var count2 = listings.Count;
            //Console.WriteLine("query: {0}", query.ToJson());
            Console.WriteLine(count2 + " results returned that are " + milesAway + " miles away");

            //values should be different.
            Assert.AreNotEqual(count1, count2, "Returned same results for 5 and 25 miles away");
        }

172 results returned that are 5 miles away
172 results returned that are 25 miles away
Test 'Housters.Test.SearchTest.NearTest' failed: 
  Returned same results for 5 and 25 miles away
  Expected: not 172
  But was:  172
    SearchTest.cs(68,0): at Housters.Test.SearchTest.NearTest()

這里有很多問題:

  1. 幾乎所有的Mongo地理空間查詢都首先采用x坐標(經度)。
  2. 當您不使用球形查詢時,Mongo只會計算簡單的笛卡爾距離,並且您需要傳遞的距離與坐標單位相同(可能為十進制)。
  3. 如果確實使用球面查詢(在附近或在內部),則需要以弧度指定距離,但是要從英里轉換為弧度,則需要除以比62.1868289大得多的數字。 通過將弧度除以地球半徑(約3,959英里),可以將弧度轉換為英里。

您上面執行的轉換實際上更接近從英里到度的轉換(以英里為單位的距離除以約69)。

確定問題是C#驅動程序還是查詢本身的一個好方法是首先使查詢在mongo shell中運行。 然后,您可以使用“ C#查詢”構建器編寫等效查詢。 作為最終檢查,您可以看到等效的JSON查詢如下:

var query = Query.Near(...); var json = query.ToJson();

您能否提供一些您認為應該退還的樣本文件?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM