通过 geoNear 获取子文档 - MongoDB
Gets sub documents by geoNear - MongoDB
我有这种情况。
在我们的数据库中有 "stores" 个文档,"branch offices" 个子文档(一对多)。
每个分支机构都有一个位置属性,该属性被索引以用于地理位置搜索。
所以,问题是:
{store:{"name":"store1", branchoffices:[{"name":"bo1","location":[ -70.64341379999999, -33.4268697 ]}, {"name":"bo2","location":[80.4,43.3]}]}}
如果我做这个聚合:
Store.collection.aggregate(
[{
"$geoNear"=>{"near"=>[ -70.64341379999999, -33.4268697 ],
"distanceField"=>"distance",
"maxDistance"=>0.0900899926955034}
},
{ "$unwind" => "$branchoffices"}
]
结果是每个分支机构的距离字段在两行或记录中重复 returned。刚刚在geoNear找到一间分店时
仅 return 地理定位搜索结果的一个或多个子文档存在某种方式?
谢谢。
$geoNear
下的选项是includeLocs
如下:
Store.aggregate([
{ "$geoNear": {
"near": [ -70.64341379999999, -33.4268697 ],
"distanceField": "distance",
"maxDistance": 0.0900899926955034,
"includeLocs": "location"
}}
])
输出在输出字段中具有匹配的 "location" 到 "distance":
{
"_id" : ObjectId("5507b18d1c3bdce0535aecd0"),
"name" : "store1",
"branchoffices" : [
{
"name" : "bo1",
"location" : [
-70.64341379999999,
-33.4268697
]
},
{
"name" : "bo2",
"location" : [
80.4,
43.3
]
}
],
"distance" : 0,
"location" : [
-70.64341379999999,
-33.4268697
]
}
如果您想要匹配中使用的数组中的特定子文档的详细信息,那么您可以使用 $redact
:
继续使用过滤器
Store.aggregate([
{ "$geoNear": {
"near": [ -70.64341379999999, -33.4268697 ],
"distanceField": "distance",
"maxDistance": 0.0900899926955034,
"includeLocs": "location"
}},
{ "$redact": {
"$cond": [
{ "$eq": [ "$location", "$$ROOT.location" ] },
"$$DESCEND",
"$$PRUNE"
]
}}
])
或者在 MongoDB 2.6 之前的版本中是这样的:
Store.aggregate([
{ "$geoNear": {
"near": [ -70.64341379999999, -33.4268697 ],
"distanceField": "distance",
"maxDistance": 0.0900899926955034,
"includeLocs": "location"
}},
{ "$unwind": "$branchoffices" },
{ "$project": {
"name": 1,
"branchoffices": 1,
"matched": {
"$eq": [ "$location", "$branchoffices.location" ]
}
}},
{ "$match": { "matched": 1 } },
{ "$group": {
"_id": "$_id",
"name": { "$first": "$name" },
"branchoffices": { "$push": "$branchoffices" },
"distance": { "$first" "$distance" }
}}
])
您可能应该注意到,在子文档中使用对象并不总是最佳解决方案,而且通常不适合各种任务。例如,如果数组中的数据可能包含 "multiple" 个位置,这些位置将是 "near" 查询点,那么只有单个 "nearest" 点才能像这样匹配。
因此,虽然您可以这样做,但最好考虑您如何使用它以及您期望的结果。在大多数情况下,位置数据应该列在它自己的文档中,而不是像这里所做的那样列在子文档数组下。
我有这种情况。
在我们的数据库中有 "stores" 个文档,"branch offices" 个子文档(一对多)。
每个分支机构都有一个位置属性,该属性被索引以用于地理位置搜索。
所以,问题是:
{store:{"name":"store1", branchoffices:[{"name":"bo1","location":[ -70.64341379999999, -33.4268697 ]}, {"name":"bo2","location":[80.4,43.3]}]}}
如果我做这个聚合:
Store.collection.aggregate(
[{
"$geoNear"=>{"near"=>[ -70.64341379999999, -33.4268697 ],
"distanceField"=>"distance",
"maxDistance"=>0.0900899926955034}
},
{ "$unwind" => "$branchoffices"}
]
结果是每个分支机构的距离字段在两行或记录中重复 returned。刚刚在geoNear找到一间分店时
仅 return 地理定位搜索结果的一个或多个子文档存在某种方式?
谢谢。
$geoNear
下的选项是includeLocs
如下:
Store.aggregate([
{ "$geoNear": {
"near": [ -70.64341379999999, -33.4268697 ],
"distanceField": "distance",
"maxDistance": 0.0900899926955034,
"includeLocs": "location"
}}
])
输出在输出字段中具有匹配的 "location" 到 "distance":
{
"_id" : ObjectId("5507b18d1c3bdce0535aecd0"),
"name" : "store1",
"branchoffices" : [
{
"name" : "bo1",
"location" : [
-70.64341379999999,
-33.4268697
]
},
{
"name" : "bo2",
"location" : [
80.4,
43.3
]
}
],
"distance" : 0,
"location" : [
-70.64341379999999,
-33.4268697
]
}
如果您想要匹配中使用的数组中的特定子文档的详细信息,那么您可以使用 $redact
:
Store.aggregate([
{ "$geoNear": {
"near": [ -70.64341379999999, -33.4268697 ],
"distanceField": "distance",
"maxDistance": 0.0900899926955034,
"includeLocs": "location"
}},
{ "$redact": {
"$cond": [
{ "$eq": [ "$location", "$$ROOT.location" ] },
"$$DESCEND",
"$$PRUNE"
]
}}
])
或者在 MongoDB 2.6 之前的版本中是这样的:
Store.aggregate([
{ "$geoNear": {
"near": [ -70.64341379999999, -33.4268697 ],
"distanceField": "distance",
"maxDistance": 0.0900899926955034,
"includeLocs": "location"
}},
{ "$unwind": "$branchoffices" },
{ "$project": {
"name": 1,
"branchoffices": 1,
"matched": {
"$eq": [ "$location", "$branchoffices.location" ]
}
}},
{ "$match": { "matched": 1 } },
{ "$group": {
"_id": "$_id",
"name": { "$first": "$name" },
"branchoffices": { "$push": "$branchoffices" },
"distance": { "$first" "$distance" }
}}
])
您可能应该注意到,在子文档中使用对象并不总是最佳解决方案,而且通常不适合各种任务。例如,如果数组中的数据可能包含 "multiple" 个位置,这些位置将是 "near" 查询点,那么只有单个 "nearest" 点才能像这样匹配。
因此,虽然您可以这样做,但最好考虑您如何使用它以及您期望的结果。在大多数情况下,位置数据应该列在它自己的文档中,而不是像这里所做的那样列在子文档数组下。