MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Cách truy vấn khóa động - Thiết kế lược đồ mongodb

Sử dụng MongoDB 3.4.4 và các phiên bản mới hơn:

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

Đường ống trên sẽ mang lại đầu ra cuối cùng

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

Giải thích

Đường ống có thể được phân tách để hiển thị kết quả của từng người vận hành.

$objectToArray

$objectToArray cho phép bạn chuyển đổi tài liệu gốc bằng các khóa động (được biểu thị bằng biến hệ thống $$ROOT ) thành một mảng có chứa một phần tử cho mỗi cặp trường / giá trị trong tài liệu gốc. Mỗi phần tử trong mảng trả về là một tài liệu chứa hai trường k và v. Chạy đường ống chỉ với toán tử trong $project sân khấu

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

lợi tức

{
    "_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 toán tử hoạt động như một cơ chế lọc cho mảng được tạo bởi $objectToArray , hoạt động bằng cách chọn một tập hợp con của mảng để trả về dựa trên điều kiện được chỉ định xuất hiện trong truy vấn của bạn.

Hãy xem xét đường dẫn sau đây trả về một mảng của cặp khóa / giá trị phù hợp với điều kiện { "samekeyA": "value1" }

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

cái nào mang lại

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

$arrayToObject

Điều này sẽ biến đổi mảng đã lọc ở trên từ

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

vào tài liệu gốc bằng khóa động

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

vì vậy chạy đường ống

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

sẽ sản xuất

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

$replaceRoot

Điều này sẽ thúc đẩy tài liệu khóa động đã lọc lên cấp cao nhất và thay thế tất cả các trường khác. Thao tác này sẽ thay thế tất cả các trường hiện có trong tài liệu đầu vào, bao gồm cả _id đồng ruộng.

Về cơ bản, điều này biến đổi tài liệu trên

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

đến đầu ra cuối cùng mong muốn

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Những hạn chế của chỉ mục từng phần là gì?

  2. Sử dụng toán tử $ slice để lấy phần tử cuối cùng của mảng

  3. Mongo ObjectID không bằng eachother

  4. làm thế nào để phát hiện xem tải tệp thành công từ phía máy khách trong js trung bình / góc cạnh hay không

  5. Cách phù hợp để quản lý các kết nối MongoDB trong ASP.Net MVC là gì?