我希望有人可以帮助我 - 我想填充一个带有地理查询的子文档来对它们进行排序:
我有这些模型(简化):
(很多文章):
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")也是限制是有效的,但我不能跳过这个回应的一些地方......
我希望有人了解我,可以帮助我=)!
非常感谢你!答案 0 :(得分:1)
所以我有一个解决我的问题的方法......
https://docs.mongodb.com/manual/reference/command/geoNear/
使用db.aggregate而不是db.find!
你可以在那里定义一个单独的查询=)