MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Получава поддокументи от geoNear - MongoDB

Опцията под $geoNear е includeLocs както следва:

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

Изходът има съвпадащо „местоположение“ с „разстояние“ в полето за изход:

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

Вероятно трябва да имате предвид, че използването на обекти в рамките на поддокумент не винаги е оптимално решение и обикновено не е подходящо за различни задачи. Например, ако вашите данни в масива вероятно съдържат „множество“ местоположения, които биха били „близо“ до заявената точка, тогава само единствената „най-близка“ точка ще може да бъде съпоставена по този начин.

Така че, докато можете да направите това, най-добре е да обмислите как го използвате и резултатите, които очаквате. В повечето случаи данните за местоположение трябва да бъдат изброени в собствен документ, а не в масив от поддокументи, както се прави тук.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да ограничите броя на документите за актуализиране в mongodb

  2. Актуализиране на много вложен масив в Mongodb

  3. Ограничете и сортирайте вградена карта/намаляване в MongoDB

  4. Mongoose find() не връща резултат

  5. Сътрудничество MongoDB мързеливо зареждане с Jackson @JsonIgnore в SpringBoot Rest Controller