猫鼬 $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!
在那里你可以定义一个单独的查询=)
我希望有人能帮助我 - 我想用地理查询填充子文档以对它们进行排序:
我有这些模型(简化版):
(很多文章):
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!
在那里你可以定义一个单独的查询=)