【问题标题】:Query $near using a value stored in the document使用存储在文档中的值查询 $near
【发布时间】:2015-09-08 21:59:57
【问题描述】:

在按我要返回的文档中的属性进行过滤时遇到问题...甚至不知道如何措辞这个问题。举例:

我正在制作一个系统,如果在用户附近弹出工作,用户将收到警报。该用户的定义如下:

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

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

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    可以使用聚合框架和它自己的$geoNear 管道运算符,将查询结果的“距离”“投影”到文档本身:

    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 本质上执行$near 查询,但也返回包含“距离”的“强制”字段,指定为您想从“距离字段”参数中调用它的任何内容。

    然后$redact 阶段查看结果并将返回的值与对象中已经存在的值进行“逻辑比较”,以查看它是否“小于”值,因此符合您的条件正在寻找。

    这是一个基本的“两阶段”聚合管道,首先“匹配”,然后根据您的条件“过滤”结果。

    【讨论】:

    • 这正是我一直在寻找的,而且它有效。谢谢!
    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多