摘要:背景最近在學習,看的是的這本書。其中中涉及到了的方法的使用。不過自己在按照作者的方法進行測試的時候,發現并不能輸出想要的結果。通過相關研究找到了解決的方法,因此分享。
背景
最近在學習MEAN,看的是Simon Helmes的Getting MEAN with Mongo, Express, ANgular, and Node這本書。其中Chapter 8 Adding Angular components to an Express application中涉及到了Mongoose的geoNear方法的使用。不過自己在按照作者的方法進行測試的時候,發現并不能輸出想要的結果。通過相關研究找到了解決的方法,因此分享。
問題作者在書中演示了通過瀏覽器的navigator.geolocation發送經緯度坐標到API接口,接著后臺使用Mongoose的geoNear方法,從數據庫中將離目標坐標較近的數據推送出來。后臺從Mongo中取數的大致代碼如下:
/* GET list of locations */ module.exports.locationsListByDistance = function(req, res) { var lng = parseFloat(req.query.lng); var lat = parseFloat(req.query.lat); var maxDistance = parseFloat(req.query.maxDistance); var point = { type: "Point", coordinates: [lng, lat] }; var geoOptions = { spherical: true, maxDistance: theEarth.getRadsFromDistance(maxDistance), num: 10 }; if ((!lng && lng!==0) || (!lat && lat!==0) || ! maxDistance) { // ... } Loc.geoNear(point, geoOptions, function(err, results, stats) { // ... }); };
其中,作者的意思是maxDistance數據是按照公里進行輸入,然后轉換為弧度,并把弧度作為參數傳入geoNear中。但是得到的結果,確實沒有任何數據輸出。
解決經過查找后發現,Mongo中對此是如下的定義:
2dsphere Index
If using a 2dsphere index, you can specify either a GeoJSON point or a legacy coordinate pair for the near value.
You must include spherical: true in the syntax.
With spherical: true, if you specify a GeoJSON point, MongoDB uses meters as the unit of measurement:db.runCommand( { geoNear:, near: { type: "Point" , coordinates: [ ] } , spherical: true, ... } ) With spherical: true, if you specify a legacy coordinate pair, MongoDB
uses radians as the unit of measurement:db.runCommand( { geoNear:, near: [ ], spherical: true, ... } )
書中的源代碼確實是GeoJSON的格式,那為何作者使用了弧度,而沒有使用米呢?原來Mongoose在3.9.5版本才支持了Mongo的這個設置。原文如下:
3.9.5 / 2014-11-10
fixed; geoNear() no longer enforces legacy coordinate pairs - supports GeoJSON #1987 alabid
用可能是作者在寫書的時候,還用的OK,后來版本更新后,設置就失效了。
解決因此,按照作者原來的思路,代碼應該改為:
/* GET list of locations */ module.exports.locationsListByDistance = function(req, res) { // ... var geoOptions = { spherical: true, maxDistance: maxDistance * 1000, // <-- num: 10 }; // ... }; var buildLocationList = function(req, res, results, stats) { var locations = []; results.forEach(function(doc) { locations.push({ distance: doc.dis / 1000, // <-- // ... }); }); return locations; };
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/18859.html
{ [MongoError: exception: geoNear command failed: { ok: 0.0, errmsg: no geo indices for geoNear }] name: MongoError, message: exception: geoNear command failed: { ok: 0.0, errmsg: no geo indices f...
摘要:集合名命名規范集合名不能是空字符串。集合名不能含有字符空字符,這個字符表示集合名的結尾。集合名不能以開頭,這是為系統集合保留的前綴。有些驅動程序的確支持在集合名里面包含,這是因為某些系統生成的集合中包含該字符。 原始文章鏈接 - 我的博客:http://www.lovebxm.com/2017/0... MongoDB - 簡介 官網:https://www.mongodb.com/ ...
摘要:不過這樣的順序對于使用弧度查詢,很容易出錯,即查詢要求順序是經度緯度,即數據和參數都是這樣的順序。對于要指定之類的入參時,使用非要注意單位換算對于使用查詢的時候,以及自動設置,無需關心入參單位轉換。 maven org.springframework.boot spring-boot-starter-data-mongo...
摘要:轉自一快速通道名詞解釋一種以文件形式存儲的數據庫模型骨架,不具備數據庫的操作能力由發布生成的模型,具有抽象屬性和行為的數據庫操作對由創建的實體,他的操作也會影響數據庫注意本學習文檔采用嚴格命名方式來區別不同對象,例如的文本屬性的數據庫模型實 轉自 https://cnodejs.org/topic/504... 一、快速通道 1.1 名詞解釋 Schema : 一種以文件形式存儲的...
摘要:學習注定少不了與數據庫打交道,而和可以說是絕配,這篇主要是簡單介紹這個模塊。通過創建查詢是數據庫中運用最多也是最麻煩的地方,這里對解讀的并不完善,僅僅是自己的一點領悟而已。 學習Node注定少不了與數據庫打交道,而MongoDB和Node可以說是絕配,這篇主要是簡單介紹Mongoose這個模塊。由于本人也是邊學邊寫的這篇文章,絕對會有新手的味道,請大神看到這里就表往下看了。 名詞介紹稍...
閱讀 3658·2021-11-15 11:37
閱讀 2317·2021-09-24 10:39
閱讀 2443·2021-07-25 21:37
閱讀 1429·2019-08-30 15:56
閱讀 2580·2019-08-30 15:55
閱讀 948·2019-08-30 15:54
閱讀 2122·2019-08-30 14:21
閱讀 853·2019-08-30 11:24