通过 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" 点才能像这样匹配。

因此,虽然您可以这样做,但最好考虑您如何使用它以及您期望的结果。在大多数情况下,位置数据应该列在它自己的文档中,而不是像这里所做的那样列在子文档数组下。