sql >> Databasteknik >  >> NoSQL >> MongoDB

Får underdokument av geoNear - MongoDB

Alternativet under $geoNear är includeLocs enligt följande:

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

Utgången har den matchade "platsen" till "avståndet" i utdatafältet:

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

Om du ville ha det specifika underdokumentet i arrayen som användes i matchen i detalj kan du fortsätta med ett filter med $redact :

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

Eller i versioner före MongoDB 2.6 så här:

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

Du bör nog notera att att använda objekt i ett underdokument inte alltid är en optimal lösning och i allmänhet inte lämpar sig för en mängd olika uppgifter. Till exempel, om din data i arrayen möjligen innehöll "flera" platser som skulle vara "nära" den frågade punkten, så skulle bara den "närmaste" singularisen kunna matchas så här.

Så även om du kan göra detta, är det bäst att överväga hur du använder det och de resultat du förväntar dig. I de flesta fall bör platsdata listas i sitt eget dokument snarare än under en underdokumentmatris som görs här.




  1. Hur kan jag behålla nolllängdsvärden under $unwind-fasen av den samlade pipelinen i Mongo?

  2. Mongoose:Hur uppdaterar man ett befintligt element i array?

  3. Installera Memcached på Debian 9

  4. DeprecationWarning:collection.findAndModify är utfasad. Använd findOneAndUpdate, findOneAndReplace eller findOneAndDelete istället?