猫鼬 $near 填充被忽略

mongoose $near populate ignored

我希望有人能帮助我 - 我想用地理查询填充子文档以对它们进行排序:

我有这些模型(简化版):

(很多文章):

   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);
        })
    },

我找到离我最近的地方 - 我可以选择有多少 - 我可以用 skip

重新加载更多

现在我想做类似的事情:

我想获取一篇文章 - 并填充存储的位置(您可以从哪里获取它们),然后我想按距离对位置进行排序,并可能跳过或限制响应

所以我尝试了:

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);
        });
    }
},

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

好吧,我希望有人能理解我并能帮助我 =)!

非常感谢!

所以我找到了解决问题的方法...

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

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

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