MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Mendapat sub dokumen oleh geoNear - MongoDB

Opsi di bawah $geoNear adalah includeLocs sebagai berikut:

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

Keluaran memiliki "lokasi" yang cocok dengan "jarak" di bidang keluaran:

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

Jika Anda menginginkan sub-dokumen tertentu dalam larik yang digunakan dalam kecocokan secara lengkap, maka Anda dapat melanjutkan dengan filter menggunakan $redact :

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

Atau di versi sebelum MongoDB 2.6 seperti ini:

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

Anda mungkin harus mencatat bahwa menggunakan objek dalam sub-dokumen tidak selalu merupakan solusi optimal dan umumnya tidak cocok untuk berbagai tugas. Misalnya, jika data Anda dalam larik mungkin berisi "beberapa" lokasi yang "dekat" dengan titik pertanyaan, maka hanya titik "terdekat" tunggal yang dapat dicocokkan seperti ini.

Jadi sementara Anda dapat melakukan ini, yang terbaik adalah mempertimbangkan bagaimana Anda menggunakannya dan hasil yang Anda harapkan. Dalam kebanyakan kasus, data lokasi harus dicantumkan dalam dokumennya sendiri daripada di bawah larik sub-dokumen seperti yang dilakukan di sini.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Indeks Senyawa Tiga Mongo

  2. Jumlah agregat MongoDB terlalu lambat

  3. Jenis dokumen tersemat yang sama mongoid untuk bidang yang berbeda

  4. mendapatkan InvalidOperationException saat menanyakan dengan AsQueryable di C #

  5. Predikat Linq Dinamis memunculkan kesalahan Filter yang Tidak Didukung dengan Driver C# MongoDB