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

Tổng hợp các kiểu phụ khác nhau trong tài liệu của một bộ sưu tập

Bạn có thể sử dụng tập hợp để thực hiện tính toán bạn muốn mà không cần thay đổi lược đồ của mình (mặc dù bạn có thể xem xét việc thay đổi lược đồ của mình chỉ đơn giản là để làm cho các truy vấn và tổng hợp của trường này dễ viết hơn).

Tôi đã chia nhỏ đường dẫn thành nhiều bước để dễ đọc. Tôi cũng đã đơn giản hóa tài liệu của bạn một chút, một lần nữa để dễ đọc.

Đầu vào mẫu:

> db.md.find().pretty()
{
    "_id" : ObjectId("512f65c6a31a92aae2a214a3"),
    "uid" : "x",
    "val" : "string"
}
{
    "_id" : ObjectId("512f65c6a31a92aae2a214a4"),
    "uid" : "x",
    "val" : "string"
}
{
    "_id" : ObjectId("512f65c6a31a92aae2a214a5"),
    "uid" : "y",
    "val" : "string2"
}
{
    "_id" : ObjectId("512f65e8a31a92aae2a214a6"),
    "uid" : "y",
    "val" : [
        "string3",
        "string4"
    ]
}
{
    "_id" : ObjectId("512f65e8a31a92aae2a214a7"),
    "uid" : "z",
    "val" : [
        "string"
    ]
}
{
    "_id" : ObjectId("512f65e8a31a92aae2a214a8"),
    "uid" : "y",
    "val" : [
        "string1",
        "string2"
    ]
}

Các giai đoạn đường ống:

> project1 = {
    "$project" : {
        "uid" : 1,
        "val" : 1,
        "isArray" : {
            "$cond" : [
                {
                    "$eq" : [
                        "$val.0",
                        [ ]
                    ]
                },
                true,
                false
            ]
        }
    }
}
> project2 = {
    "$project" : {
        "uid" : 1,
        "valA" : {
            "$cond" : [
                "$isArray",
                "$val",
                [
                    null
                ]
            ]
        },
        "valS" : {
            "$cond" : [
                "$isArray",
                null,
                "$val"
            ]
        },
        "isArray" : 1
    }
}
> unwind = { "$unwind" : "$valA" }
> project3 = {
    "$project" : {
        "_id" : 0,
        "uid" : 1,
        "val" : {
            "$cond" : [
                "$isArray",
                "$valA",
                "$valS"
            ]
        }
    }
}

Tổng hợp cuối cùng:

> db.md.aggregate(project1, project2, unwind, project3, group)
{
    "result" : [
        {
            "_id" : "z",
            "vals" : [
                "string"
            ]
        },
        {
            "_id" : "y",
            "vals" : [
                "string1",
                "string4",
                "string3",
                "string2"
            ]
        },
        {
            "_id" : "x",
            "vals" : [
                "string"
            ]
        }
    ],
    "ok" : 1
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose:không thể truy cập giá trị đã nhập

  2. Mongodb tổng hợp, Làm thế nào để đếm tài liệu theo tiêu chí khoảng thời gian?

  3. Tìm kiếm ngày và bỏ qua thời gian trong mongoDB

  4. Tạo chế độ xem mongo phụ thuộc vào thời điểm hiện tại

  5. Mongodb / Mongoid - {:multi => true} có nghĩa là gì