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

Cách chọn dữ liệu với điều kiện nhất định

chỉnh sửa

có cấu trúc như thế này:

{
    "_id" : ObjectId("575e4c8731dcfb59af388e1d"),
    "name" : "Maria",
    "providers" : [ 
        {
            "type" : "facebook",
            "data" : "fb.com",
            "privacy" : true
        }, 
        {
            "type" : "twitter",
            "data" : "twitter.com",
            "privacy" : false
        }, 
        {
            "type" : "google",
            "data" : "google.com",
            "privacy" : true
        }, 
        {
            "type" : "phno",
            "data" : "+1-1289741824124",
            "privacy" : true
        }
    ]
}

với truy vấn như sau:

db.maria.aggregate([{
            $project : {
                _id : 1,
                name : 1,
                "providers" : {
                    $filter : {
                        input : "$providers",
                        as : "p",
                        cond : {
                            $eq : ["$$p.privacy", true]
                        }
                    }
                }
            }
        }
    ])
    ])

chúng tôi đang đạt được đầu ra năng động và chúng tôi không cần quan tâm đến tên nhà cung cấp vì điều này được bao hàm bởi cấu trúc chung

{
    "providers" : [ 
        {
            "type" : "facebook",
            "data" : "fb.com",
            "privacy" : true
        }, 
        {
            "type" : "google",
            "data" : "google.com",
            "privacy" : true
        }, 
        {
            "type" : "phno",
            "data" : "+1-1289741824124",
            "privacy" : true
        }
    ],
    "name" : "Maria"
}

kết thúc chỉnh sửa

Cách bạn có thể nhận được điều này là sử dụng khung tổng hợp. Vì chúng ta có một mảng cho mỗi trường, trước tiên chúng ta cần giải nén nó, sau đó chúng ta có thể sử dụng $project để đặt giá trị trường hoặc đơn giản là null. Vì điều này trông giống như một truy vấn đơn giản, nó có thể gây ra một chút rắc rối. Cách chúng tôi có thể cải thiện điều đó là thay đổi cấu trúc tài liệu, để có một mảng các trình cung cấp và trường cung cấp đơn giản.

Các giai đoạn tổng hợp bên dưới:

db.maria.find()
var unwindFb = {
    $unwind : "$facebook"
}
var unwindtw = {
    $unwind : "$twitter"
}
var unwindgo = {
    $unwind : "$google"
}
var unwindph = {
    $unwind : "$phno"
}
var project = {
    $project : {
        _id : 1,
        name : 1, // list other fields here

        facebook : {
            $cond : {
                if  : {
                    $gte : ["$facebook.privacy", true]
                },
            then : [{
                    data : "$facebook.data",
                    privacy : "$facebook.privacy"
                }
            ],
            else  : null
        }
    },
    twitter : {
        $cond : {
            if  : {
                $gte : ["$twitter.privacy", true]
            },
        then : [{
                data : "$twitter.data",
                privacy : "$twitter.privacy"
            }
        ],
        else  : null
    }
},
google : {
    $cond : {
        if  : {
            $gte : ["$google.privacy", true]
        },
    then : [{
            data : "$google.data",
            privacy : "$google.privacy"
        }
    ],
    else  : null
}
},
phno : {
    $cond : {
        if  : {
            $gte : ["$phno.privacy", true]
        },
    then : [{
            data : "$phno.data",
            privacy : "$phno.privacy"
        }
    ],
    else  : null
}
}
}
}

db.maria.aggregate([unwindFb, unwindtw, unwindgo, unwindph, project])

thì đầu ra sẽ như thế này:

{
    "_id" : ObjectId("575df49d31dcfb59af388e1a"),
    "name" : "Maria",
    "facebook" : [ 
        {
            "data" : "fb.com",
            "privacy" : true
        }
    ],
    "twitter" : null,
    "google" : [ 
        {
            "data" : "google.com",
            "privacy" : true
        }
    ],
    "phno" : [ 
        {
            "data" : "+1-1289741824124",
            "privacy" : true
        }
    ]
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bạn sẽ lập mô hình khách hàng> đặt hàng> mục đặt hàng> sản phẩm trong cơ sở dữ liệu NoSql như thế nào?

  2. $ in yêu cầu một mảng làm đối số thứ hai, tìm thấy:thiếu

  3. mongodb:làm thế nào để lọc ra các bản ghi được tạo ngày hôm nay?

  4. Mongo cố gắng kết nối tự động với cổng 27017 (localhost)

  5. Hình dung cấu trúc liên kết cụm của bạn trong ClusterControl