我正在尝试查找与我的条件匹配的邻域-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'
}
}
]);
答案 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
}
}
}
}
)