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

Kueri MongoDB dengan grup bersyarat berdasarkan pernyataan

Kode Anda tidak berfungsi, karena $cond bukan operator akumulator. Hanya ini operator akumulator, dapat digunakan dalam $group panggung.

Dengan asumsi catatan Anda berisi tidak lebih dari dua kemungkinan nilai source seperti yang Anda sebutkan dalam pertanyaan Anda, Anda dapat menambahkan $project . bersyarat stage dan ubah $group panggung sebagai,

Kode:

    db.customer.aggregate([
        {
            $group: {
                "_id": {
                    "id": "$id",
                    "firstName": "$firstName",
                    "lastName": "$lastName",
                    "code": "$code"
                },
                "sourceA": { $first: "$source" },
                "sourceB": { $last: "$source" }
            }
        },
        {
            $project: {
                "source": {
                    $cond: [
                        { $eq: ["$sourceA", "email"] },
                        "$sourceB",
                        "$sourceA"
                    ]
                }
            }
        }
    ])

Jika ada lebih dari dua kemungkinan nilai untuk sumber, maka Anda dapat melakukan hal berikut:

  • Group dengan id , firstName , lastName dan code . Kumpulkan nilai unik source , menggunakan $addToSet operator.
  • Gunakan $redact untuk menyimpan hanya nilai selain email .
  • Project bidang yang diperlukan, jika source array kosong (semua elemen telah dihapus), tambahkan nilai email untuk itu.
  • Unwind bidang sumber untuk mencantumkannya sebagai bidang dan bukan larik.(opsional)

Kode:

    db.customer.aggregate([
        {
            $group: {
                "_id": {
                    "id": "$id",
                    "firstName": "$firstName",
                    "lastName": "$lastName",
                    "code": "$code"
                },
                "sourceArr": { $addToSet: { "source": "$source" } }
            }
        },
        {
            $redact: {
                $cond: [
                    { $eq: [{ $ifNull: ["$source", "other"] }, "email"] },
                    "$$PRUNE",
                    "$$DESCEND"
                ]
            }
        },
        {
            $project: {
                "source": {
                    $map: {
                        "input":
                        {
                            $cond: [
                                { $eq: [{ $size: "$sourceArr" }, 0] },
                                [{ "source": "item" }],
                                "$sourceArr"]
                        },
                        "as": "inp",
                        "in": "$$inp.source"
                    }
                }
            }
        }
    ])



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. FluentMongo tiba-tiba melempar kesalahan

  2. Grup MongoDB berdasarkan jenis yang berbeda bersama-sama

  3. node-mongodb-native:Bagaimana saya bisa membagikan objek db api dari panggilan balik koneksi melalui aplikasi saya

  4. bagaimana cara menggunakan grup di pymongo untuk mengelompokkan baris yang serupa?

  5. Teks mongodb mencari beberapa bidang