sql >> Database teknologi >  >> NoSQL >> MongoDB

Henter underdokumenter af geoNear - MongoDB

Indstillingen under $geoNear er includeLocs som følger:

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

Outputtet har den matchede "placering" til "afstanden" i outputfeltet:

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

Hvis du ville have det specifikke underdokument i det array, der blev brugt i kampen i fuld detalje, kunne du fortsætte med et filter ved hjælp af $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ør MongoDB 2.6 som denne:

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 skal nok bemærke, at brug af objekter i et underdokument ikke altid er en optimal løsning og generelt ikke egnet til en række opgaver. For eksempel, hvis dine data i arrayet muligvis indeholdt "flere" placeringer, der ville være "nær" det forespurgte punkt, så ville kun det ental "nærmeste" punkt kunne matches på denne måde.

Så mens du kan gøre dette, er det bedst at overveje, hvordan du bruger det, og de resultater, du forventer. I de fleste tilfælde bør lokationsdata være opført i dets eget dokument i stedet for under et underdokumentarray, som det gøres her.




  1. Sådan analyseres diskbrug af en Docker-container

  2. MongoDB $regex-forespørgsel og potentielle udnyttelser

  3. Hvordan henter man alle objekter i en Mongodb-samling inklusive id'erne?

  4. Fejl:queryTxt ETIMEOUT ved forbindelse til MongoDb Atlas ved hjælp af mongoose