mongoose $ near populate被忽略了

时间:2017-06-01 08:00:08

标签: node.js mongodb mongoose populate

我希望有人可以帮助我 - 我想填充一个带有地理查询的子文档来对它们进行排序:

我有这些模型(简化):

(很多文章):

   var articleSchema = mongoose.Schema({
      places: [{ type: mongoose.Schema.Types.ObjectId, ref: "places", required: false }],
      someData: { type: String, required: true },
})

(很多地方):

var placeSchema = mongoose.Schema({
   longitudelatitude: {
      type: { type: String, required: true },
      coordinates: [
       { type: Number, required: true }, //longitude 
       { type: Number, required: true }  //latitude 
       ]},
   someData: { type: String, required: true }
})

我的第一个查询只找到位置附近的地方正常工作:

getPlacesNearBy: function (lng, lat, skipNumber, limitNumber, callback) {
   Place.find({
     longitudelatitude: {
        $near: {
            $geometry: { type: "Point", coordinates: [lng, lat] },}}
        }, null, {skip: skipNumber, limit: limitNumber}, function (err, foundPlaces) {
            if (err)
                return callback(err, null);
            return callback(null, foundPlaces);
        })
    },

我靠近我的地方 - 我可以选择限制多少 - 我可以用跳过重新加载一些

现在我想做类似的事情:

我想得到一篇文章 - 并填充存储的地方(你可以获得它们)以及我想要按距离对地点进行排序,以及跳过或限制响应

所以我尝试了:

getPlacesforArticle: function (articleId, lng, lat, skipNumber, limitNumber, callback) {
    var projection = null;
    Article.findById(articleId, {places: 1}).populate("places", projection, {
        longitudelatitude: {
            $near: {
                $geometry: { type: "Point", coordinates: [lng, lat] },
            }
        }
    }, {skip: skipNumber, limit: limitNumber}).exec(function (getError, foundArticle) {
        if (getError)
             return callback(getError, null);
        callback(null, foundArticle.places);
        });
    }
},

所以这个查询正在运行(不抛出任何错误),但它没有响应我想要的东西 - 我得到了地方,但他们是"命令"通过数据库顺序而不是距离 - 所以$ near似乎被忽略(测试没有这个查询带来相同的结果)但是当我过滤到其他一些工作正常的内容(比如Name =" test")也是限制是有效的,但我不能跳过这个回应的一些地方......

我希望有人了解我,可以帮助我=)!

非常感谢你!

1 个答案:

答案 0 :(得分:1)

所以我有一个解决我的问题的方法......

https://docs.mongodb.com/manual/reference/command/geoNear/

使用db.aggregate而不是db.find!

你可以在那里定义一个单独的查询=)