使用let变量的管道和geoIntersects查找

时间:2018-09-06 14:40:04

标签: mongodb mongodb-query aggregation-framework

我正在尝试查找与我的条件匹配的邻域-boundries多边形与帖子的坐标相交,但是我做不到-无法在我的let中使用pipeline $match

帖子实体示例:

{
  _id: ObjectId,
  ...,
  location: {
    ...,
    coordinates: {
      type: 'Point',
      coordinates: [number, number]
    }
  }
};

邻域实体的示例:

{
  _id: ObjectId,
  ...,
  boundries: {
    type: 'Polygon',
    coordinates: [ [ [number, number], [number, number], [number, number], [number, number], [number, number] ] ]
  }
};

我试图“修复”的查询示例:

db.posts.aggregate([
  { $match: { _id: ObjectId('5a562e62100338001218dffa') } },
  {
    $lookup: {
      from: 'neighborhoods',
      let: { postCoordinates: '$location.coordinates.coordinates' },
      pipeline: [
        {
          $match: {
            boundries: {
              $geoIntersects: {
                $geometry: {
                  type: 'Point',
                  coordinates: '$$postCoordinates'
                }
              }
            }
          }
        }
      ],
      as: 'neighborhoods'
    }
  }
]);

1 个答案:

答案 0 :(得分:3)

不幸的是,无法从文档字段中填充坐标。

地理空间是查询表达式,$let变量仅允许在$match变体形式的$expr变量中用于$lookup管道中的聚合表达式。

您必须分两步执行查询。

第一步,获取匹配记录的坐标。

var result =  db.posts.findOne({ _id: ObjectId('5a562e62100338001218dffa')},{ _id: 0, 'location':1});

第二步,在多边形中寻找点。

db.neighborhoods.find(
   {
     "boundries": {
       $geoIntersects: {
          $geometry: {
             type: "Point" ,
             coordinates: result.location.coordinates.coordinates
          }
       }
     }
   }
)