我有一个这样的集合:
origin: {
location : {
type: String,
coordinates: [lgnt,lat]
}
},
destination: {
location : {
type: String,
coordinates: [lgnt,lat]
}
}
使用索引:' 2dsphere'在location.origin和location.destination。
然后我从另一个人那里得到了另一个'点和'到'点,我试图在DB中获取所有文档:
对于一个或另一个,没关系:
db.find({
'origin.location': {
$nearSphere: {
$geometry: {
type: "Point",
coordinates: [from.lng, from.lat]
},
$maxDistance: 10
}
}
})
然而,在文档中,它是写的,我不能使用两个$ near查询。我尝试了一些类似的东西:
db.find({
'origin.location': {
$nearSphere: {
$geometry: {
type: "Point",
coordinates: [from.lng, from.lat]
},
$maxDistance: 10
}
},
'destination.location': {
$nearSphere: {
$geometry: {
type: "Point",
coordinates: [to.lng, to.lat]
},
$maxDistance: 10
}
}
});
由于使用两个$ near / $ nearSphere而无法正常工作。 所以我尝试了
$and : [
$near: ...,
$near: ...
]
它也不起作用。
我尝试使用汇总但您无法在$near
中使用$match
。
你会怎么做 ?
LineString
并尝试查询类似的' LineString
,但该怎么做?var origines = db.find({
'origin.location': {
$nearSphere: {
$geometry: {
type: "Point",
coordinates: [from.lng, from.lat]
},
$maxDistance: 10
}
}
}, {
_id: 1
})
origines = origines.map(function(elem) {
return elem._id;
});
db.find({
$and: [{
_id: {
$in: origines
}
}, {
'destination.location': {
$nearSphere: {
$geometry: {
type: "Point",
coordinates: [to.lng, to.lat]
},
$maxDistance: 10
}
}
}]
});
但不,
答案 0 :(得分:0)
从mongoDB 4.2开始,您可以计算到目标的距离,然后使用match。
db.getCollection('test').aggregate([
{
$geoNear: {
near: {
type: "Point",
coordinates: [ from.lng, from.lat ]
},
distanceField: "distanceToOrigin",
maxDistance: 10,
spherical: true
}
},
{
$addFields: {
"distanceToDestination" : {
$multiply: [
6371000,
{ $acos: { $add: [
{ $multiply: [
{ $sin: { $degreesToRadians: {"$arrayElemAt": ["$destination.location.coordinates", 1]} } },
{ $sin: { $degreesToRadians: to.lat } }
]},
{ $multiply: [
{ $cos: { $degreesToRadians: {"$arrayElemAt": ["$destination.location.coordinates", 1]} } },
{ $cos: { $degreesToRadians: to.lat } },
{ $cos: { $degreesToRadians: { "$subtract": [ { "$arrayElemAt": ["$destination.location.coordinates", 0] }, to.lng ] } } }
]}
] } }
]
}
}
},
{
$match: { "distanceToDestination": {$lt: 10} }
}
])