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

Cara menanyakan kunci dinamis - desain skema mongodb

Menggunakan MongoDB 3.4.4 dan versi yang lebih baru:

db.coll.aggregate([
    { "$replaceRoot": {
        "newRoot": {
            "$arrayToObject": {
                "$filter": {
                    "input": { "$objectToArray": "$$ROOT" },
                    "as": "el",
                    "cond": {
                        "$eq": [
                            "$$el.v.samekeyA",
                            "value1"
                        ]
                    }
                }
            }
        }   
    } }
])

Pipa di atas akan menghasilkan keluaran akhir

{
    "key1" : {
        "samekeyA" : "value1",
        "samekeyB" : "value2"
    }
}

Penjelasan

Pipeline dapat didekomposisi untuk menunjukkan hasil masing-masing operator.

$objectToArray

$objectToArray memungkinkan Anda untuk mengubah dokumen root dengan kunci dinamis (dilambangkan dengan variabel sistem $$ROOT ) ke dalam larik yang berisi elemen untuk setiap pasangan bidang/nilai dalam dokumen asli. Setiap elemen dalam larik kembali adalah dokumen yang berisi dua bidang k dan v.Menjalankan pipeline hanya dengan operator di $project panggung

db.coll.aggregate([
    { "$project": {
        "keys": { "$objectToArray": "$$ROOT" }
    } }
])

hasil

{
    "_id" : 1,
    "keys" : [ 
        {
            "k" : "_id",
            "v" : 1
        }, 
        {
            "k" : "key1",
            "v" : {
                "samekeyA" : "value1",
                "samekeyB" : "value2"
            }
        }, 
        {
            "k" : "key2",
            "v" : {
                "samekeyA" : "value3",
                "samekeyB" : "value4"
            }
        }, 
        {
            "k" : "key3",
            "v" : {
                "samekeyA" : "value5",
                "samekeyB" : "value6"
            }
        }
    ]
}

$filter

$filter operator bertindak sebagai mekanisme pemfilteran untuk larik yang dihasilkan oleh $objectToArray operator, bekerja dengan memilih subset array untuk dikembalikan berdasarkan kondisi tertentu yang menjadi kueri Anda.

Pertimbangkan pipa berikut yang mengembalikan larik pasangan kunci/nilai yang cocok dengan kondisi { "samekeyA": "value1" }

db.coll.aggregate([
    { "$project": {
        "keys": { 
            "$filter": {
                "input": { "$objectToArray": "$$ROOT" },
                "as": "el",
                "cond": {
                    "$eq": [
                        "$$el.v.samekeyA",
                        "value1"
                    ]
                }
            }  
        }
    } }
])

yang menghasilkan

{
    "_id" : 1,
    "keys" : [ 
        {
            "k" : "key1",
            "v" : {
                "samekeyA" : "value1",
                "samekeyB" : "value2"
            }
        }
    ]
}

$arrayToObject

Ini akan mengubah array yang difilter di atas dari

[ 
    {
        "k" : "key1",
        "v" : {
            "samekeyA" : "value1",
            "samekeyB" : "value2"
        }
    }
]

ke dokumen asli dengan kunci dinamis

{
    "key1" : {
        "samekeyA" : "value1",
        "samekeyB" : "value2"
    }
}

jadi jalankan pipeline

db.coll.aggregate([
    { "$project": {
        "key": {
            "$arrayToObject": {
                "$filter": {
                    "input": { "$objectToArray": "$$ROOT" },
                    "as": "el",
                    "cond": {
                        "$eq": [
                            "$$el.v.samekeyA",
                            "value1"
                        ]
                    }
                }
            }
        }   
    } }
])

akan menghasilkan

{
    "_id" : 1,
    "key" : {
        "key1" : {
            "samekeyA" : "value1",
            "samekeyB" : "value2"
        }
    }
}

$replaceRoot

Ini akan mempromosikan dokumen kunci dinamis yang difilter ke tingkat teratas dan menggantikan semua bidang lainnya. Operasi menggantikan semua bidang yang ada di dokumen input, termasuk _id bidang.

Pada dasarnya ini mengubah dokumen di atas

{
    "_id" : 1,
    "key" : {
        "key1" : {
            "samekeyA" : "value1",
            "samekeyB" : "value2"
        }
    }
}

ke hasil akhir yang diinginkan

{
    "key1" : {
        "samekeyA" : "value1",
        "samekeyB" : "value2"
    }
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongodb:upserting:hanya mengatur nilai jika dokumen sedang dimasukkan

  2. Gabungkan dua pernyataan $or

  3. Temukan MongoDB()

  4. Pengindeksan pada beberapa bidang di mongoDB

  5. Bagaimana cara mendapatkan database saat ini yang ditulis oleh Mongoid?