通过我正在尝试返回的文档中的属性进行过滤问题...甚至不确定如何说出问题。例如:
我正在建立一个系统,如果在他们附近弹出一个工作,将会提醒用户。该用户定义如下:
var user = new Schema({
location: {type:[Number], index: '2dsphere', required:true},
maxDistance: {type:Number, required:true},
});
工作:
var job = new Schema({
location: {type:[Number], index: '2dsphere', required:true},
});
创建作业时,如何找到合适的用户?我需要来自用户的.maxDistance属性...
var job = //new job, save, etc.
users.find({
location: {$near: job.location, $maxDistance: ????user.maxDistance??? }
}, function(err, users){});
有没有办法做到这一点?谢谢!
答案 0 :(得分:1)
可以使用聚合框架和它自己的$geoNear
管道运营商来实现"投射" a"距离"从查询结果到文档本身:
template <bool b, typename T>
class TheTemplateWeWant { ... };
template<typename T>
using ThePolicy = TheTemplateWeWant<true, T>
因此users.aggregate(
[
{ "$geoNear": {
"near": job.location,
"spherical": true,
"distanceField": "distance"
}},
{ "$redact": {
"$cond": {
"if": { "$lt": [ "$distance", "$maxDistance" ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
],
function(err,results) {
// deal with response
}
);
基本上执行$geoNear
查询,但也返回&#34;强制性&#34;字段包含&#34;距离&#34;指定为你想要从&#34; distanceField&#34;参数。
然后$redact
阶段查看结果,&#34;逻辑比较&#34;返回的值返回到对象中已存在的值,以查看它是否小于&#34;小于&#34;而不是价值,因此符合您要搜索的标准。
这是一个基本的&#34;两个阶段&#34;聚合管道到第一个&#34;匹配&#34;然后&#34;过滤&#34;结果基于您的标准。