我将这个例子中的代码用于执行查找(左联接),然后执行geoNear。
db.jobs.aggregate([
{
"$lookup": {
"from": "companies",
"localField": "company",
"foreignField": "_id",
"as": "company",
"pipeline": [
{
"$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-80,
44
],
},
"key": "company.geo",
"distanceField": "distance"
}
}
]
}
}
])我创建了一个蒙戈游乐场
我搞错了
$geoNear is only valid as the first stage in an optimized pipeline如何在查找管道中执行geoNear?删除管道显示已连接的文档。
发布于 2022-11-08 16:37:47
根本原因是您对$lookup使用了简洁的语法。从正式文件,
新的简洁语法消除了在$expr操作符的外部和本地字段上在$match阶段匹配相等的要求。
因此,将localField和foreignField的匹配作为子管道的第一阶段来处理.
解决方案:您可以简单地将子句移到$geoNear之后的另一个$geoNear阶段
db.jobs.aggregate([
{
"$lookup": {
"from": "companies",
"let": {
company: "$company"
},
"as": "company",
"pipeline": [
{
"$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-80,
44
],
},
"key": "company.geo",
"distanceField": "distance"
}
},
{
$match: {
$expr: {
$eq: [
"$_id",
"$$company"
]
}
}
}
]
}
}
])蒙戈游乐场似乎无法证明这种情况下的行为,因为它涉及2d指数的使用。不过,我还是把它放在这里了。
https://stackoverflow.com/questions/74363863
复制相似问题