我的node.js MongoDB 2dsphere find()调用有什么问题?

时间:2016-08-25 00:52:37

标签: node.js mongodb mongodb-query geojson

在mongodb中,我有两个可以使用的集合,可以帮助我回答问题"Where are the cell towers in my state?"

第一个集合是从人口普查数据创建的,它具有状态边界的多边形。

第二个集合是通过下载OpenCellId数据库并导入它而创建的。 “l”是塔的位置坐标键。

javascript代码需要获取状态,然后在该状态下打印塔。

我使用内华达州Polygon的文本(复制/粘贴)代替find()调用中的stateBounds变量完成了此操作。

但是,当传递完全相同的对象而非复制/粘贴时,console.log("Tower found: %j", item);调用会打印"Tower found: [Circular]"

const mongoUrl  = 'mongodb://localhost:27017/test';
const hostname  = '127.0.0.1';
var MongoClient = require('mongodb').MongoClient;

MongoClient.connect(mongoUrl, function(err, db){ 
    var towers  = db.collection('celltowers');
    var states  = db.collection('states');
    states.findOne({"properties.STUSPS": "NV"},function(err, item){
        getTowers(towers, item);
    }); 

});

function getTowers(celltowers, state) {
    var stateBounds = JSON.stringify(state, "geometry.coordinates");
    celltowers.find({l:{$geoWithin:{$geometry:{type: "Polygon", coordinates: stateBounds}}}}, function(err, item) {
        console.log("Tower found: %j", item);
    }); 
}

我需要为celltowers.find()使用geojson Polygon。

我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

假设您的数据库如下:

{
   //Some more fields as well
   geometry:{coordinates : [0,12]};
}

您在查询中尝试的是不对的。您尝试将整个记录即state作为coordinates。相反,您应该从查询查询中的记录中给出坐标值。

这可以解决您的问题: -

function getTowers(celltowers, state) {
  var stateBounds = JSON.stringify(state);

  celltowers.find({l:{$geoWithin:{$geometry:
  {
     type: "Polygon", 
     coordinates: stateBounds.geometry.coordinates //Change is here.
  }
  }}}, function(err, item) 
  {
    console.log("Tower found: %j", item);
  });
}

您可以参考doc了解有关如何使用的更多信息。