我试图找到查询给定方案的正确方法。
我有一堆用户,他们有一个位置latlng和一个用户定义的半径。 我对位置latlng感兴趣。 现在我想找到他们所有的用户,包括兴趣点的latlng。
我提供了如何查询,但这显然是错误的。
架构:
const POISchema = new mongoose.Schema({
poi_uuid: {type: String, required: true},
category_uuid: {type: Number, required: true},
category: {type: String, ref: 'SubCategory'},
activity: {type: String, required: false},
infos: {type: String, required: false},
location: {
coordinates: {type: [Number], index: '2d', required: false, default: []}
}
}, {usePushEach: true});
const UserSchema = new mongoose.Schema({
user_uuid: {type: String, required: true},
helper_radius: {type: Number, required: true},
address: {
coordinates: {type: [Number], index: '2d', required: false, default: []}
}
}, {usePushEach: true});
查询:
User.find()
.and([
{
latlng: {
$near: [parseFloat(obj.coordinates[0]), parseFloat(obj.coordinates[1])],
$maxDistance: parseFloat(20 / 111.2)
}
},
{'_id': {'$ne': obj._id}},
{'categories': obj.category_uuid}
])
.exec(function (err, users) {
if (err) {
console.log(err);
return res.send(500, JSON.stringify(err))
}
return res.send({users: users})
})
我知道我可能需要使用$ geoWithin或$ geoIntersects。但我真的不知道我怎么读,就像我能找到的一切。我甚至没有找到如何使用mongoose为具有定义半径的2d球体声明模式字段。也许有人可以指出我正确的方向或有一些有用的链接。
答案 0 :(得分:0)
我认为你正在寻找这样的东西:
var poi; // this is the point of interest for which I want to find the users nearby
User.aggregate(
[
{ "$geoNear": {
"near": poi.location.coordinates,
"distanceField": "distance"
}},
{ "$redact": {
"$cond": {
"if": { "$lt": [ "$distance", "$helper_radius" ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
],
function(err,results) {
// read the response
}
);