Percebi que $near e $nearSphere retornam dados completamente diferentes e fiquei desconfiado. Afinal, quando a latitude está próxima do equador, a distância da esfera não deve diferir muito da distância euclidiana.
db.tablebusiness.find({ "LongitudeLatitude" : { "$nearSphere" : [106.772835, -6.186753], "$maxDistance" : 0.053980478460939611 }, "Prominent" : { "$gte" : 15 }, "indexContents" : { "$all" : [/^soto/, /^nasi/] } }).limit(200);
Ele retorna 48 dados.
vou anexar mesmo assim
/* 0 */
{
"_id" : "nasi-uduk-soto-ayam__-6.18_106.77",
"BuildingID" : null,
"Title" : "Nasi Uduk Soto Ayam",
"InBuildingAddress" : null,
"Building" : null,
"Street" : "Jl. Panjang",
"Districts" : [],
"City" : "Jakarta",
"Country" : "Indonesia",
"LongitudeLatitudeFromGoogle" : null,
"DistanceFromGoogleAddress" : 0.0,
"Checkin" : 0,
"Note" : null,
"PeopleCount" : 0,
"Prominent" : 45.5,
"CountViews" : 0,
"StreetAdditional" : null,
"LongitudeLatitude" : {
"Longitude" : 106.765673160553,
"Latitude" : -6.17522230915668
},
"Rating" : {
"Stars" : 0.0,
"Weight" : 0.0
},
"CurrentlyWorkedURL" : null,
"Reviews" : [],
"ZIP" : null,
"Tags" : ["Restaurant"],
"Phones" : [],
"Website" : null,
"Email" : null,
"Price" : null,
"openingHour" : null,
"Promotions" : [],
"SomethingWrong" : false,
"BizMenus" : [],
"Brochures" : [],
"Aliases" : [],
"indexContents" : ["restaura", "estauran", "staurant", "taurant", "aurant", "urant", "rant", "ant", "nt", "t", "nasi", "asi", "si", "i", "uduk", "duk", "uk", "k", "soto", "oto", "to", "o", "ayam", "yam", "am", "m"]
}
/* 1 */
{
"_id" : "nasi-soto-padang_pasar-slipi-jaya_-6.19_106.80",
"BuildingID" : null,
"Title" : "Nasi Soto Padang",
"InBuildingAddress" : "Lt.1 Los Alas",
"Building" : null,
"Street" : "Jl.Kemanggisan Utama Raya",
"Districts" : [],
"City" : "Jakarta",
"Country" : "Indonesia",
"LongitudeLatitudeFromGoogle" : null,
"DistanceFromGoogleAddress" : 0.0,
"Checkin" : 0,
"Note" : null,
"PeopleCount" : 0,
"Prominent" : 45.5,
"CountViews" : 0,
"StreetAdditional" : null,
"LongitudeLatitude" : {
"Longitude" : 106.79647564888,
"Latitude" : -6.18998465381734
},
"Rating" : {
"Stars" : 0.0,
"Weight" : 0.0
},
"CurrentlyWorkedURL" : null,
"Reviews" : [],
"ZIP" : null,
"Tags" : ["Restaurant"],
"Phones" : [],
"Website" : null,
"Email" : null,
"Price" : null,
"openingHour" : null,
"Promotions" : [],
"SomethingWrong" : false,
"BizMenus" : [],
"Brochures" : [],
"Aliases" : [],
"indexContents" : ["restaura", "estauran", "staurant", "taurant", "aurant", "urant", "rant", "ant", "nt", "t", "nasi", "asi", "si", "i", "soto", "oto", "to", "o", "padang", "adang", "dang", "ang", "ng", "g"]
}
...
/* 47 */
{
"_id" : "nasi-gandul__-7.43_109.24",
"BuildingID" : null,
"Title" : "Nasi Gandul",
"InBuildingAddress" : null,
"Building" : null,
"Street" : "Jl. Brobahan Pr - 40 rt 004 Rw 004",
"Districts" : [],
"City" : "Purwokerto",
"Country" : "Indonesia",
"LongitudeLatitudeFromGoogle" : null,
"DistanceFromGoogleAddress" : 0.0,
"Checkin" : 0,
"Note" : null,
"PeopleCount" : 0,
"Prominent" : 30.5,
"CountViews" : 0,
"StreetAdditional" : null,
"LongitudeLatitude" : {
"Longitude" : 109.239182174206,
"Latitude" : -7.42585664273589
},
"Rating" : {
"Stars" : 3.0,
"Weight" : 1.0
},
"CurrentlyWorkedURL" : null,
"Reviews" : [],
"ZIP" : "53116",
"Tags" : ["Angkringan", "Restaurant Indonesian", "Soto & Sop"],
"Phones" : ["+62(281)7918181"],
"Website" : null,
"Email" : null,
"Price" : null,
"openingHour" : null,
"Promotions" : [],
"SomethingWrong" : false,
"BizMenus" : [],
"Brochures" : [],
"Aliases" : [],
"indexContents" : ["angkring", "ngkringa", "gkringan", "kringan", "ringan", "ingan", "ngan", "gan", "an", "n", "restaura", "estauran", "staurant", "taurant", "aurant", "urant", "rant", "ant", "nt", "t", "indonesi", "ndonesia", "donesian", "onesian", "nesian", "esian", "sian", "ian", "soto", "oto", "to", "o", "&", "sop", "op", "p", "nasi", "asi", "si", "i", "gandul", "andul", "ndul", "dul", "ul", "l"]
}
Eu coloco os dados no excel e calculo a distância usando esta fórmula
=SQRT(POWER(E2-$G$1,2)+POWER((F2-$H$1)*COS($H$1*PI()/180),2))
Esse deve se aproximar bastante da distância esférica. Observe também que a latitude é -6, que não está longe do equador.
aqui está o resultado
0.013516826
0.023857967
0.037658667
0.038737146
0.042414787
0.046725248
0.051006427
0.053567221
0.057448344
0.061592999
0.062329244
0.065276161
0.066035611
0.076251787
0.109671831
0.112097201
0.13417281
0.136471939
0.172293693
1.058802838
1.078123028
1.079160684
1.080954023
1.081148114
1.081099449
1.092061283
1.094281476
1.094431917
1.096845722
1.097063729
1.096953691
1.097201996
1.105389179
1.105442127
1.10839237
1.108717834
1.108840349
1.111636423
1.113187903
1.118767984
1.118767984
1.133952371
1.135077548
1.154967917
1.161142923
1.185994885
1.199509086
2.756884824
Aqui está a captura de tela da minha planilha do Excel
Aqui está o Excel real
106.772835 -6.186753
"_id" "nasi-uduk-soto-ayam__-6.18_106.77", 106.7656732 -6.175222309 0.013516826
"_id" "nasi-soto-padang_pasar-slipi-jaya_-6.19_106.80", 106.7964756 -6.189984654 0.023857967
"_id" "nasi-uduk-soto-ayam__-6.22_106.77", 106.7718959 -6.224620499 0.037658667
"_id" "nasi-campur-%26-soto-babat-kenanga_komp.-ruko-permata-senayan%2C_-6.22_106.79", 106.79199 -6.22062 0.038737146
"_id" "soto-mie-nasi_indomaret-(univ.-mercu-buana)_-6.21_106.74", 106.7379928 -6.211082144 0.042414787
"_id" "soto-kudus%2C-soto-ayam-%26amp%3B-nasi-pindang_plaza-senayan_-6.23_106.80", 106.7989969 -6.225694167 0.046725248
"_id" "soto-kudus%2C-soto-ayam-%26amp%3B-nasi-pindang_plaza-bri-ii_-6.22_106.81", 106.8136847 -6.217476287 0.051006427
"_id" "soto-kudus%2C-soto-ayam-%26amp%3B-nasi-pindang_automall-indonesia_-6.23_106.81", 106.8096431 -6.225898946 0.053567221
"_id" "soto-kudus%2C-soto-ayam-%26amp%3B-nasi-pindang_menara-mulia_-6.22_106.82", 106.81656 -6.224232983 0.057448344
"_id" "nasi-gule-gandaria__-6.24_106.80", 106.795285 -6.244444863 0.061592999
"_id" "nasi-soto-monggo-mampir__-6.24_106.80", 106.7971516 -6.244479441 0.062329244
"_id" "nasi-soto-ayam-\"pak-min\"__-6.24_106.82", 106.8151546 -6.236743573 0.065276161
"_id" "nasi-soto-ayam-pak-min---santa__-6.24_106.81", 106.812959 -6.239508 0.066035611
"_id" "soto-mie-nasi-bogor__-6.23_106.83", 106.8322349 -6.234845139 0.076251787
"_id" "nasi-uduk-soto-ayam__-6.24_106.87", 106.8693781 -6.239089942 0.109671831
"_id" "soto-ayam-%2F-nasi-uduk-betawi__-6.28_106.71", 106.714092 -6.282785 0.112097201
"_id" "soto-minang-roda-jaya_ruko-tongkol-indah_-6.12_106.89", 106.889044 -6.119294471 0.13417281
"_id" "nasi-bebek-dan-soto-mas-muchlis_summarecon-kelapa-gading_-6.16_106.91", 106.9059021 -6.156281135 0.136471939
"_id" "nasi-liwet-%26-soto-kwali-kalimalang__-6.25_106.93", 106.9338112 -6.248527508 0.172293693
"_id" "soto-ayam-nasi-rames__-6.88_107.58", 107.5751638 -6.881692483 1.058802838
"_id" "nasi-liwet-soto-solo_rumah-mode_-6.88_107.60", 107.5998616 -6.882452292 1.078123028
"_id" "nasi-soto-ayam-madura__-6.91_107.57", 107.5749707 -6.912900474 1.079160684
"_id" "nasi-soto-mie__-6.89_107.60", 107.5969434 -6.890355658 1.080954023
"_id" "nasi-rames-soto-bandung-enjoi__-6.89_107.60", 107.5970721 -6.890504777 1.081148114
"_id" "nasi-soto-ayam__-6.91_107.58", 107.5769877 -6.913560825 1.081099449
"_id" "nasi-soto-ayam__-6.91_107.60", 107.5977552 -6.90656 1.092061283
"_id" "nasi-soto-ayam-madura__-6.89_107.62", 107.6157832 -6.888615935 1.094281476
"_id" "nasi-goreng-soto-ayam__-6.90_107.61", 107.6093245 -6.89662571 1.094431917
"_id" "nasi-soto-gulai-kambing__-6.90_107.61", 107.6090455 -6.900715755 1.096845722
"_id" "putra-bengawan-nasi-goreng-%26-soto__-6.89_107.62", 107.617187 -6.891298 1.097063729
"_id" "nasi-soto-ayam__-6.90_107.61", 107.6088095 -6.901163102 1.096953691
"_id" "nasi-uduk-%26amp%3B-soto-kikil-cak-khohar__-6.89_107.61", 107.6144958 -6.894765295 1.097201996
"_id" "nasi-soto-ayam__-6.90_107.62", 107.6204395 -6.900453028 1.105389179
"_id" "nasi-goreng-soto-ayam__-6.90_107.62", 107.6206326 -6.900303912 1.105442127
"_id" "nasi-soto-ayam-madura__-6.91_107.62", 107.6169634 -6.909279174 1.10839237
"_id" "nasi-soto_pasar-baru_-6.92_107.61", 107.605226 -6.923423387 1.108717834
"_id" "nasi-soto-ayam-madura_pasar-baru_-6.92_107.61", 107.6053333 -6.92348729 1.108840349
"_id" "nasi-soto-sarinah__-6.90_107.63", 107.631175 -6.897282 1.111636423
"_id" "nasi-uduk-soto__-6.89_107.64", 107.6361465 -6.893636262 1.113187903
"_id" "nasi-soto-ayam-madura__-6.91_107.63", 107.629376 -6.910677 1.118767984
"_id" "nasi-soto-ayam__-6.91_107.63", 107.629376 -6.910677 1.118767984
"_id" "nasi-uduk-soto__-6.94_107.62", 107.6248813 -6.93937772 1.133952371
"_id" "nasi-soto-ayam-khas-madura__-6.94_107.63", 107.625749 -6.940099 1.135077548
"_id" "nasi-uduk-%26amp%3B-soto__-6.96_107.64", 107.638936 -6.955310213 1.154967917
"_id" "nasi-soto-ayam_ruko-metro-trade-center_-6.94_107.66", 107.6600504 -6.940208438 1.161142923
"_id" "nasi-soto-ayam-khas-madura__-6.94_107.69", 107.6948118 -6.937141164 1.185994885
"_id" "nasi-soto-ayam-khas-madura-cak-nonk__-6.93_107.72", 107.7156472 -6.932668019 1.199509086
"_id" "nasi-gandul__-7.43_109.24", 109.2391822 -7.425856643 2.756884824
Olhe novamente o termo na consulta
"$maxDistance" : 0.053980478460939611
Vai saber.
Você está vendo muitos resultados em
$nearSphere
comparação com$near
porque, com operadores de geometria esférica (ou seja$nearSphere
, ), você também precisa converter quaisquer distâncias usadas na consulta (ou seja,$maxDistance
) em radianos para obter o resultado correto. Aqui, não parece que você converteu$maxDistance
para radianos.Para converter de distância para radianos, divida a distância pelo raio da Terra. Se você estiver usando unidades métricas, isso seria 6378,137 km. Se você estiver usando unidades imperiais, seria: 3963,192 mi
Tente a
$nearSphere
consulta novamente com$maxDistance
convertido para radianos.