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

Mongodb 1to1 relasi antar subdokumen

Mempertimbangkan "lekukan" yang saya gunakan dalam daftar, ini mungkin terlihat lebih panjang daripada yang Anda lakukan, tetapi sebenarnya tidak.

Ini adalah contoh lain yang sangat bagus untuk menggunakan $map seperti yang tersedia untuk MongoDB 2.6 dan yang lebih baru. Masih ada beberapa penggunaan $unwind , tetapi array yang "dibatalkan" sebenarnya hanya memiliki satu elemen di dalamnya. Jadi, maafkan "Highlander" saya referensi yang tidak bisa saya tolak :)

db.users.aggregate([

    // Match your document or documents
    { "$match": {
        "commentUpvotes.id": 12
    }},

    // Get the one "up-votes" entry that matches
    { "$project": {
        "posts": 1,
        "comments": 1,
        "commentUpVotes": {
            "$setDifference": [
                { 
                    "$map": {
                        "input": "$commentUpvotes",
                        "as": "el",
                        "in": {
                            "$cond": [
                                { "$eq": [ "$$el.id", 12 ] },
                                "$$el",
                                false
                            ]
                        }  
                    }
                },
                [false]
            ]
        }
    }},

    // There is only one!
    { "$unwind": "$commentUpVotes" },

    // Get the one comments entry that matches
    { "$project": {
        "posts": 1,
        "comments": {
            "$setDifference": [
                { 
                    "$map": {
                        "input": "$comments",
                        "as": "el",
                        "in": {
                            "$cond": [
                                { 
                                    "$eq": [ 
                                        { "$substr": [ "$$el.id", 0, 4 ] }, 
                                        "$commentUpVotes.commentId"
                                    ] 
                                },
                                "$$el",
                                false
                            ]
                        }  
                    }
                },
                [false]
            ]
        },
        "commentUpVotes": 1
    }},

    // And there is only one!
    { "$unwind": "$comments" },

    // Get the one post that matches
    { "$project": { 
        "posts": {
            "$setDifference": [
                { 
                    "$map": {
                        "input": "$posts",
                        "as": "el",
                        "in": {
                            "$cond": [
                                { 
                                    "$eq": [ 
                                        "$$el.id", 
                                        "$comments.postId"
                                    ] 
                                },
                                "$$el",
                                false
                            ]
                        }  
                    }
                },
                [false]
            ]
        },
        "comments": 1,
        "commentUpVotes": 1
    }},

    // Optionally group back to arrays. There can be only one!
    { "$group": {
        "_id": "$_id",
        "posts": { "$first": "$posts" },
        "comments": { "$push": "$comments" },
        "commentUpVotes": { "$push": "$commentUpVotes" }
    }}

])

Jadi hasil akhirnya adalah:

{
    "_id" : ObjectId("539065d3cd0f2aac5f55778e"),
    "posts" : [
            {
                    "title" : "post1",
                    "id" : "123"
            }
    ],
    "comments" : [
            {
                    "id" : 1910,
                    "postId" : "123",
                    "title" : "comment1",
                    "comment" : "some comment",
                    "user" : "user13"
            }
    ],
    "commentUpVotes" : [
            {
                    "id" : 12,
                    "commentId" : "1910",
                    "upvotedBy" : "user91"
            }
    ]
}

Saya tahu Anda meminta "tidak ada perubahan skema", tetapi sebenarnya bukan perubahan skema untuk mengatakan itu adalah ide yang baik untuk menyimpan id Anda nilai di sini dari jenis yang konsisten. Saat ini Anda sedang mencampur bilangan bulat dan string dalam proses ini ( saya harap ini hanya sebuah contoh ) yang bukan ide yang baik.

Jadi ada beberapa "casting terbatas" yang sebenarnya tersedia digunakan di sini menggunakan $substr , namun solusi Anda yang sebenarnya mungkin berbeda dalam cara melakukannya. Saya sangat menyarankan untuk memperbaiki data jika memang perlu diperbaiki.

Bagaimanapun, penggunaan yang cukup keren untuk $map




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Salin Database di Mongoose

  2. Bagaimana menemukan perbedaan jam antara dua tanggal di mongodb

  3. Bagaimana cara mengatur ulang kartu dan daftar seperti Trello?

  4. Apakah mungkin untuk menghasilkan Koleksi MongoDB yang dinamai secara dinamis?

  5. Mengejek model luwak dengan lelucon