MongoDB $geoNear 聚合管道(使用查询选项和使用 $match 管道操作)给出不同的结果
MongoDB $geoNear aggregation pipeline (using query option and using $match pipeline operation) giving different no of results
我使用 $geoNear 作为聚合框架的第一步。我需要根据 "tag" 字段过滤掉结果,它工作正常,但我看到有两种方法都给出了不同的结果。
样本MongoDB文档
{
"position": [
40.80143,
-73.96095
],
"tag": "pizza"
}
我已将 2dsphere 索引添加到 "position" 键
db.restaurants.createIndex( { 'position' : "2dsphere" } )
查询 1
使用$match聚合管道操作根据"tag" key过滤出结果
db.restaurants.aggregate(
[
{
"$geoNear":{
"near": { type: "Point", coordinates: [ 55.8284,-4.207] },
"limit":100,
"maxDistance":10*1000,
"distanceField": "dist.calculated",
"includeLocs": "dist.location",
"distanceMultiplier":1/1000,
"spherical": true
}
},{
"$match":{"tag":"pizza"}
},
{
"$group":{"_id":null,"totalDocs":{"$sum":1}}
}
]
);
查询 2
在 $geoNear 聚合操作中使用查询根据 "tag" 键 过滤结果
db.restaurants.aggregate(
[
{
"$geoNear":{
"query" : {"tag":"pizza"}
"near": { type: "Point", coordinates: [ 55.8284,-4.207] },
"limit":100,
"maxDistance":10*1000,
"distanceField": "dist.calculated",
"includeLocs": "dist.location",
"distanceMultiplier":1/1000,
"spherical": true
}
},
{
"$group":{"_id":null,"totalDocs":{"$sum":1}}
}
]
);
分组选项只是为了获取两个查询返回的文档数。
两个查询返回的 totalDocs 似乎不同。
有人可以向我解释这两个查询之间的区别吗?
几个假设:-
1. 假设有 300 条根据位置匹配的记录。
2. 假设第一组 100 个结果没有标签 pizza。其余 200 个文档(101 到 300)具有标签 pizza
查询 1:-
- 有 2 个管道操作 $geoNear 和 $match
- $geoNear 管道操作的输出是 $match 的输入
管道操作
- $geoNear 查找最多 100 个结果(我们指定的限制)基于
位置按从近到远排序。 (注意这里的
返回的 100 个结果完全基于位置。所以这100
结果不包含任何带标签 "pizza")
的文档
- 这100个结果被发送到下一个管道操作$match from
过滤发生的地方。但由于第一组 100 个结果
没有标签披萨,输出为空
查询 2:-
- 只有 1 个管道操作 $geoNear
- $geoNear 管道操作中包含一个查询字段
$geoNear 查找最多 100 个结果(我们指定的限制)基于
按从近到远排序的位置和查询
标签=披萨
- 现在这里从 101 到 200 的结果作为输出返回
查询包含在管道操作 $geoNear 中。所以在
我们说一个简单的句子,找到所有位置为 [x,y] 的文档
标签=披萨。
P.S : - 添加 $group 管道阶段只是为了获取计数,因此没有在解释中写到它
// If you have to apply multiple criteria to find locations then this query might helpful
const userLocations = await userModel.aggregate([
{
$geoNear: {
near: { type: "Point", coordinates: [data.lon1,data.lat1]
},//set the univercity points
spherical: true,
distanceField: "calcDistance",
// maxDistance: 2400,//25km
"distanceMultiplier": 0.001,
}
},
{ $unwind: "$location" },
{ $match: {
"location": {
$geoWithin: {
$centerSphere: [
[ 73.780553, 18.503327], 20/ 6378.1 //check the user point is present here
]
}
}
}},
])
我使用 $geoNear 作为聚合框架的第一步。我需要根据 "tag" 字段过滤掉结果,它工作正常,但我看到有两种方法都给出了不同的结果。
样本MongoDB文档
{ "position": [ 40.80143, -73.96095 ], "tag": "pizza" }
我已将 2dsphere 索引添加到 "position" 键
db.restaurants.createIndex( { 'position' : "2dsphere" } )
查询 1
db.restaurants.aggregate( [ { "$geoNear":{ "near": { type: "Point", coordinates: [ 55.8284,-4.207] }, "limit":100, "maxDistance":10*1000, "distanceField": "dist.calculated", "includeLocs": "dist.location", "distanceMultiplier":1/1000, "spherical": true } },{ "$match":{"tag":"pizza"} }, { "$group":{"_id":null,"totalDocs":{"$sum":1}} } ] );
查询 2
db.restaurants.aggregate( [ { "$geoNear":{ "query" : {"tag":"pizza"} "near": { type: "Point", coordinates: [ 55.8284,-4.207] }, "limit":100, "maxDistance":10*1000, "distanceField": "dist.calculated", "includeLocs": "dist.location", "distanceMultiplier":1/1000, "spherical": true } }, { "$group":{"_id":null,"totalDocs":{"$sum":1}} } ] );
分组选项只是为了获取两个查询返回的文档数。
两个查询返回的 totalDocs 似乎不同。
有人可以向我解释这两个查询之间的区别吗?
几个假设:-
1. 假设有 300 条根据位置匹配的记录。
2. 假设第一组 100 个结果没有标签 pizza。其余 200 个文档(101 到 300)具有标签 pizza
查询 1:-
- 有 2 个管道操作 $geoNear 和 $match
- $geoNear 管道操作的输出是 $match 的输入 管道操作
- $geoNear 查找最多 100 个结果(我们指定的限制)基于 位置按从近到远排序。 (注意这里的 返回的 100 个结果完全基于位置。所以这100 结果不包含任何带标签 "pizza") 的文档
- 这100个结果被发送到下一个管道操作$match from 过滤发生的地方。但由于第一组 100 个结果 没有标签披萨,输出为空
查询 2:-
- 只有 1 个管道操作 $geoNear
- $geoNear 管道操作中包含一个查询字段 $geoNear 查找最多 100 个结果(我们指定的限制)基于 按从近到远排序的位置和查询 标签=披萨
- 现在这里从 101 到 200 的结果作为输出返回 查询包含在管道操作 $geoNear 中。所以在 我们说一个简单的句子,找到所有位置为 [x,y] 的文档 标签=披萨。
P.S : - 添加 $group 管道阶段只是为了获取计数,因此没有在解释中写到它
// If you have to apply multiple criteria to find locations then this query might helpful
const userLocations = await userModel.aggregate([
{
$geoNear: {
near: { type: "Point", coordinates: [data.lon1,data.lat1]
},//set the univercity points
spherical: true,
distanceField: "calcDistance",
// maxDistance: 2400,//25km
"distanceMultiplier": 0.001,
}
},
{ $unwind: "$location" },
{ $match: {
"location": {
$geoWithin: {
$centerSphere: [
[ 73.780553, 18.503327], 20/ 6378.1 //check the user point is present here
]
}
}
}},
])