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

Agregat dari subtipe yang berbeda dalam dokumen koleksi

Anda dapat menggunakan agregasi untuk melakukan perhitungan yang Anda inginkan tanpa mengubah skema Anda (meskipun Anda mungkin mempertimbangkan untuk mengubah skema Anda hanya untuk membuat kueri dan agregasi bidang ini lebih mudah untuk ditulis).

Saya memecah pipa menjadi beberapa langkah agar mudah dibaca. Saya juga sedikit menyederhanakan dokumen Anda, sekali lagi agar mudah dibaca.

Contoh masukan:

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

Tahapan pipeline:

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

Agregasi akhir:

> 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. MongoDB - tidak dapat menggunakan .explain() untuk mendapatkan info kueri dalam kode C#?

  2. Apa hak istimewa pengguna MongoDB yang saya perlukan untuk menambahkan pengguna ke database mongo baru/lain?

  3. MongoDB menemukan catatan hari ini

  4. Berfungsi untuk menukar nilai di NodeJS dengan mongo+luwak

  5. kesulitan menggunakan janji dengan luwak