如何在圆形对象半径内找到$ near

时间:2015-08-03 16:56:10

标签: node.js mongodb mongodb-query aggregation-framework

我很难用mongo查询为文档中的字段分配值:

我的架构是

var TestSchema = new Schema({
  loc: {
    lng: {
      type: Number
    },
    lat: {
      type: Number
    }
  },
  radius: {
    type: Number
  }
});
module.exports = mongoose.model("Test", TestSchema );`

我想找到该字段提供的半径范围内的所有文件。

Test.find({'loc': {'$near':[0.001, 0.001] ,'$maxDistance': ???}});

我试过而不是??? :this.radius但似乎没有奏效。 感谢。

1 个答案:

答案 0 :(得分:0)

您无法在标准查询操作中以这种方式分配文档中的值。而是使用此处aggregation framework来“投射”从查询点开始的距离,然后看到该距离落在文档的指定半径范围内。

您使用$geoNear管道运算符来投影距离和$redact操作,以删除不符合半径范围内的文档:

Test.aggregate(
    [
        { "$geoNear": {
            "near": [0.001, 0.001],
            "distanceField": "distance"
        }},
        { "$redact": {
            "$cond": {
                "if": { "$lt": "$distance", "$radius" },
                "then": "$$KEEP",
                "else": "$$PRUNE"
            }
        }}
    ],
    function(err,results) {

    }
) 

注意$geoNear运算符上的选项。需要“distanceField”,因为这是表示与查询点的距离的字段。其他选项如“球形”和“distanceMultiplier”可能适用,具体取决于您的索引是“2sphere”还是分别使用传统的GeoJSON坐标对。