使用存储在文档中的值查询$ near

时间:2015-09-08 11:29:53

标签: mongodb mongoose mongodb-query aggregation-framework

通过我正在尝试返回的文档中的属性进行过滤问题...甚至不确定如何说出问题。例如:

我正在建立一个系统,如果在他们附近弹出一个工作,将会提醒用户。该用户定义如下:

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

有没有办法做到这一点?谢谢!

1 个答案:

答案 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;结果基于您的标准。