sql >> Database >  >> NoSQL >> MongoDB

Krijgt subdocumenten door geoNear - MongoDB

De optie onder $geoNear is includeLocs als volgt:

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

De uitvoer heeft de overeenkomende "locatie" met de "afstand" in het uitvoerveld:

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

Als je het specifieke subdocument in de array dat in de wedstrijd werd gebruikt in alle details wilde hebben, dan zou je kunnen doorgaan met een filter met behulp van $redact :

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

Of in versies vóór MongoDB 2.6 zoals deze:

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

U moet er waarschijnlijk rekening mee houden dat het gebruik van objecten in een subdocument niet altijd een optimale oplossing is en over het algemeen niet geschikt is voor een verscheidenheid aan taken. Als uw gegevens in de array bijvoorbeeld mogelijk "meerdere" locaties bevatten die "nabij" het opgevraagde punt zouden zijn, dan zou alleen het enkelvoudige "dichtstbijzijnde" punt op deze manier kunnen worden vergeleken.

Dus hoewel u dit kunt doen, is het het beste om te overwegen hoe u het gebruikt en welke resultaten u verwacht. In de meeste gevallen moeten locatiegegevens in het eigen document worden vermeld in plaats van onder een subdocumentarray zoals hier wordt gedaan.




  1. Overloop sorteerfase gebufferd datagebruik overschrijdt interne limiet

  2. MongoDB werkt niet. FOUT:dbpath (/data/db) bestaat niet.

  3. MongoDB-documentontwerp voor opmerkingen (en hun antwoordopmerkingen)

  4. Hoe $in operator te gebruiken in mongodb met twee velden in java