因此,假设我的“请求”集合中有以下文档:
{
pickup: {
coords: null
},
meetup: {
coords: [ someLng, someLat ]
}
},
{
pickup: {
coords: null
},
meetup: {
coords: [ someLng, someLat ]
}
},
{
pickup: {
coords: [ someLng, someLat ]
},
meetup: {
coords: [ someLng, someLat ]
}
}
目标是按照从用户位置到最近位置的距离,向用户显示一个排序的请求列表。
如果pickup.coords
可用,则应将其作为后续表达式的位置参考,否则采用meetup.coords
。
我尝试使用$cond
,但出现错误,并且不确定如何正确使用它。
这是我认为可以工作的:
const query = {
$cond: {
if: {
'pickup.coords': { $exists: true }
},
then: {
// use pickup.coords as reference for distance to user
},
else: {
// use meetup.coords as reference for distance to user
}
}
}
const requests = await Request.find( query )
错误:unknown top level operator: $cond
最后,请求将变得更加复杂,因为我将对limit
进行分页,并使用$near
运算符进行一些索引。但是,最好完成第一步:-)
任何帮助将不胜感激!
答案 0 :(得分:0)
修改您的应用程序,以支持您查询的格式插入文档。再添加一个包含要搜索的坐标的字段:
{
pickup: {
coords: null
},
meetup: {
coords: [ someLng, someLat ]
},
_search: {
coords: [ someLng, someLat ]
}
},
{
pickup: {
coords: null
},
meetup: {
coords: [ someLng1, someLat1 ]
},
_search: {
coords: [ someLng1, someLat1 ]
}
},
{
pickup: {
coords: [ someLng2, someLat2 ]
},
meetup: {
coords: [ someLng3, someLat3 ]
},
_search: {
coords: [ someLng2, someLat2 ]
}
}
此字段的索引:
db.collection.createIndex( { _search : "2dsphere" } )
在此字段上搜索:
db.collection.find(
{
_search: {
$nearSphere: {
$geometry: {
type : "Point",
coordinates : [ someLng4, someLat4 ]
}
}
}
}
)