MongoDB 根据文档中的字段使用地理查询查找文档
MongoDB find documents using geo query depending on fields inside document
以下是 MongoDB 文档的示例:
{
radius: 5000,
location: {
type: 'Point',
coordinates: [60.1241, 12.12454351] // [long, lat]
}
}
现在我希望能够 query/find 给定点 p = [long, lat]
落在圆心 location.coordinates
和半径 [=15= 的圆给出的半径内的所有文档].
我想到的最好的是这个
find({
"location": {
$geoWithin: {
$centerSphere: [p, 5000],
},
},
});
但我不知道如何让半径不被硬编码而是来自文档字段。
我发现了一个类似的问题,并根据该问题创建了一个可行的解决方案。 ()
您必须先添加 2dsphere 的索引。 (https://docs.mongodb.com/manual/core/2dsphere/)
然后使用以下聚合:
aggregate([
{
$geoNear: {
near: {
type: "Point",
coordinates: [60.1241, 12.12454351],
},
distanceField: "distance",
maxDistance: 40000, // optional (can be set if you know the max radius)
},
},
{
$redact: {
$cond: {
if: { $lte: ["$distance", "$radius"] },
then: "$$KEEP",
else: "$$PRUNE",
},
},
},
]);
您首先计算并添加一个新字段distance
。然后你只保留与半径有一定距离的文件。
以下是 MongoDB 文档的示例:
{
radius: 5000,
location: {
type: 'Point',
coordinates: [60.1241, 12.12454351] // [long, lat]
}
}
现在我希望能够 query/find 给定点 p = [long, lat]
落在圆心 location.coordinates
和半径 [=15= 的圆给出的半径内的所有文档].
我想到的最好的是这个
find({
"location": {
$geoWithin: {
$centerSphere: [p, 5000],
},
},
});
但我不知道如何让半径不被硬编码而是来自文档字段。
我发现了一个类似的问题,并根据该问题创建了一个可行的解决方案。 (
您必须先添加 2dsphere 的索引。 (https://docs.mongodb.com/manual/core/2dsphere/)
然后使用以下聚合:
aggregate([
{
$geoNear: {
near: {
type: "Point",
coordinates: [60.1241, 12.12454351],
},
distanceField: "distance",
maxDistance: 40000, // optional (can be set if you know the max radius)
},
},
{
$redact: {
$cond: {
if: { $lte: ["$distance", "$radius"] },
then: "$$KEEP",
else: "$$PRUNE",
},
},
},
]);
您首先计算并添加一个新字段distance
。然后你只保留与半径有一定距离的文件。