mongo执行$ near查找的范围错误

时间:2016-04-24 01:43:26

标签: javascript mongodb geojson

使用mongo执行$near查找时遇到一个奇怪的错误。数据库只是疯了,吐出我们的范围错误。

以下此代码段完美无缺

mongoose.models.Users.findOne({_id: req.user.id}, function(err, loggedin) {
    var location = JSON.parse(JSON.stringify(loggedin.location));
    mongoose.models.Users.find({
      location: { $near: { $geometry: location } },
    }, (err, users) => {

    })
})

但是,如果我登上JSON.parse(JSON.stringify())克隆,那就吓坏了

mongoose.models.Users.findOne({_id: req.user.id}, function(err, loggedin) {
    var location = loggedin.location;
    mongoose.models.Users.find({
      location: { $near: { $geometry: location } },
    }, (err, users) => {

    })
})

如您所见,使用mongoose但不应影响此查询。 location中必须有一些我无法看到的额外内容,但我无法找到它。

如果我在数据库查询后立即console.log loggedin.location,我会得到这个:

location: { type: 'Point', coordinates: [ -118.3141928, 34.0806176 ] },

我还设置了一个调试断点并得到了相同的东西

另外一个值得注意的事实是,如果我使用findOne执行lean()查询,那么它只返回普通的JSON,那么第二个查询就能完美地运行。我想知道在访问geoJSON属性时是否有一些由mongoose调用的getter。

我的Mongoose架构设置如此

const UserSchema = new Schema({
  location: {
    type: { type: String },
    coordinates: [],
  },
})
userSchema.index({ location: '2dsphere' });

试图在没有额外任务的情况下尝试此操作,并将查询简单地作为

运行
location: { $near: { $geometry: loggedin.location } },

但是得到了同样的错误。

另一个有趣的事实是,如果我使用mongoose.models.Users.collection进入本机客户端并执行我的查询,我根本不会收到错误。

Sample gist with mongo shell output and native query

1 个答案:

答案 0 :(得分:0)

尝试通过此代码

 $geoNear: {
            near: {type: "Point", coordinates:[parseFloat(req.query.latitude), parseFloat(req.query.longitude )]},
            distanceField: "dist.calculated",
            maxDistance:10000,
            spherical: true
        }