MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Ruft Unterdokumente von geoNear - MongoDB ab

Die Option unter $geoNear ist includeLocs wie folgt:

Store.aggregate([
    { "$geoNear": {
        "near": [ -70.64341379999999, -33.4268697 ],
        "distanceField": "distance", 
        "maxDistance": 0.0900899926955034,
        "includeLocs": "location"
    }}
])

Die Ausgabe hat den passenden "Ort" zur "Entfernung" im Ausgabefeld:

{
    "_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
    ]
}

Wenn Sie das spezifische Unterdokument in dem Array, das in der Übereinstimmung verwendet wurde, in allen Einzelheiten haben möchten, können Sie mit einem Filter fortfahren, der $redact :

Store.aggregate([
    { "$geoNear": {
        "near": [ -70.64341379999999, -33.4268697 ],
        "distanceField": "distance", 
        "maxDistance": 0.0900899926955034,
        "includeLocs": "location"
    }},
    { "$redact": {
        "$cond": [
            { "$eq": [ "$location", "$$ROOT.location" ] },
            "$$DESCEND",
            "$$PRUNE"
        ]
    }}
])

Oder in Versionen vor MongoDB 2.6 so:

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" }
    }}
])

Beachten Sie, dass die Verwendung von Objekten innerhalb eines Unterdokuments nicht immer eine optimale Lösung darstellt und für eine Vielzahl von Aufgaben im Allgemeinen nicht geeignet ist. Wenn Ihre Daten im Array beispielsweise möglicherweise "mehrere" Orte enthalten, die "in der Nähe" des abgefragten Punktes liegen, dann kann nur der einzelne "nächste" Punkt auf diese Weise abgeglichen werden.

Während Sie dies tun können, ist es am besten, zu überlegen, wie Sie es verwenden und welche Ergebnisse Sie erwarten. In den meisten Fällen sollten Standortdaten in einem eigenen Dokument aufgeführt werden und nicht wie hier in einem Unterdokument-Array.