考虑以下用例:我们有一个公司集合,每个公司都有多个办事处。然后,办公室有一个位置:
[
{
"name": "stackoverflow",
"offices": [
{"offname": "so_l1", "location": {"type": "Point", "coordinates": [X + 1, Y + 1]}},
{"offname": "so_l2", "location": {"type": "Point", "coordinates": [X + 2, Y + 2]}}
]
},
{
"name": "quora",
"offices": [
{"offname": "q_l1", "location": {"type": "Point", "coordinates": [X + 3, Y + 3]}},
{"offname": "q_l2", "location": {"type": "Point", "coordinates": [X + 666, Y + 666]}}
]
}
]
createIndex({offices.location. '2dsphere'})
让X, Y
成为一些地理坐标。现在,我想找到最接近(X, Y)
的3个办事处。我也希望它们处于扁平结构中。最终结果应包含[so_l1, so_l2, q_l1]
。
所以我想尝试聚合管道,$geoNear
后跟$unwind
。
但是,当我尝试执行管道的第一步时:
"$geoNear": {
"near": {"type": "Point", "coordinates": [X, Y]},
"distanceField": "distance",
"includeLocs": "resLocation",
"spherical": true
// what about limit? if i put it here, it will be applied at the document level
}
它将返回2个结果,按距离递增排序,是所有office子文档中的最低距离(includeLocs字段相同)。
有没有办法通过地理空间索引查找超过1个办公室?或者复制外部集合条目(公司),以便我可以在下一步中轻松解开条目?
除了创建扁平的办公室集合然后使用地理空间索引查找顶级文档之外,还有其他方法可以解决此特定用例吗?