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

Masukkan jika tidak ada, jika tidak hapus MongoDB

Itu bukan cara yang baik untuk menerapkan up-votes dan downvotes. Selain kerangka kerja agregasi yang tidak menjadi mekanisme untuk memperbarui dokumen dengan cara apa pun, Anda tampaknya cenderung berpikir itu mungkin solusi karena logika yang ingin Anda terapkan. Tetapi agregat tidak diperbarui.

Apa yang Anda inginkan pada Anda, sebut saja skema "pertanyaan" adalah struktur seperti ini:

{
    "_id": ObjectId("53f51a844ffa9b02cf01c074"),
    "upvoted": [],
    "downvoted": [],
    "upvoteCount": 0,
    "downvoteCount": 0
}

Itu adalah sesuatu yang dapat bekerja dengan baik dengan pembaruan atom dan benar-benar memberi Anda beberapa informasi stateful tentang objek pada saat yang sama.

Untuk array "upvoted" dan "downvoted", kita akan menganggap bahwa voting "pengguna" memiliki nilai ObjectId unik yang serupa. Jadi yang akan kita lakukan adalah $push atau $pull dari salah satu larik dan juga "menambah/mengurangi" nilai penghitung bersama dengan masing-masing operasi tersebut.

Begini cara kerjanya untuk upvote:

db.questions.update(
    { 
        "_id": ObjectId("53f51a844ffa9b02cf01c074"),
        "upvoted": { "$ne": ObjectId("53f51c0a4ffa9b02cf01c075") }
        "downvoted": ObjectId("53f51c0a4ffa9b02cf01c075")
    },
    {         
        "$push": { "upvoted": ObjectId("53f51c0a4ffa9b02cf01c075") },
        "$inc": { "upvoteCount": 1, "downvoteCount": -1 },
        "$pull": { "downvoted": ObjectId("53f51c0a4ffa9b02cf01c075") },
    }
)

db.questions.update(
    { 
        "_id": ObjectId("53f51a844ffa9b02cf01c074"),
        "upvoted": { "$ne": ObjectId("53f51c0a4ffa9b02cf01c075") }
    },
    {
        "$push": { "upvoted": ObjectId("53f51c0a4ffa9b02cf01c075") },
        "$inc": { "upvoteCount": 1 },
    }
)

Sebenarnya itu adalah dua operasi, yang dapat Anda lakukan dengan AP operasi massal Saya juga (mungkin benar-benar cara terbaik) tetapi ada benarnya. Pernyataan pertama hanya akan cocok dengan dokumen di mana pengguna saat ini memiliki "downvote" yang direkam dalam array. Karena itu, kami sudah "mendorong" nilai id pengguna itu ke larik "turun suara". Jika tidak ada maka tidak ada pembaruan yang dilakukan. Tetapi Anda berdua mendorong dan menarik dari larik masing-masing dan juga "menambah/mengurangi" bidang penghitung secara bersamaan.

Dengan pernyataan kedua yang hanya akan cocok dengan sesuatu di mana yang pertama tidak, Anda membuat penilaian yang adil bahwa sekarang Anda tidak perlu menyentuh "downvotes" dan hanya menangani bidang upvote. Dalam kedua kasus, hal yang aman untuk dilakukan adalah memastikan bahwa kondisi utama adalah nilai id pengguna saat ini tidak ada dalam larik "terpilih".

Untuk downvotes, bidang hanya dibalik:

db.questions.update(
    { 
        "_id": ObjectId("53f51a844ffa9b02cf01c074"),
        "downvoted": { "$ne": ObjectId("53f51c0a4ffa9b02cf01c075") }
        "upvoted": ObjectId("53f51c0a4ffa9b02cf01c075")
    },
    {         
        "$pull": { "upvoted": ObjectId("53f51c0a4ffa9b02cf01c075") },
        "$inc": { "upvoteCount": -1, "downvoteCount": 1 },
        "$push": { "downvoted": ObjectId("53f51c0a4ffa9b02cf01c075") },
    }
)

db.questions.update(
    { 
        "_id": ObjectId("53f51a844ffa9b02cf01c074"),
        "downvoted": { "$ne": ObjectId("53f51c0a4ffa9b02cf01c075") }
    },
    {
        "$push": { "downvoted": ObjectId("53f51c0a4ffa9b02cf01c075") },
        "$inc": { "downvoteCount": 1 },
    }
)

Secara alami Anda dapat melihat perkembangan logis untuk membatalkan "upvote/downvote" apa pun untuk pengguna yang bersangkutan. Anda juga dapat menjadi pintar jika Anda ingin dan mengekspos informasi di klien Anda untuk tidak hanya menunjukkan jika pengguna saat ini telah "meningkatkan/menurunkan" tetapi juga mengontrol tindakan klik dan menghilangkan permintaan yang tidak perlu.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara mengakses file bersarang dengan Pick<> TypeScript

  2. Penjadwal prosedur tersimpan backend dalam database MongoDB

  3. Mengapa alert didefinisikan [fine]d, dan kemudian dua baris kemudian, bukan (Meteor)?

  4. Di Mongodb , bagaimana cara memeriksa apakah semua dokumen unik untuk suatu nilai?

  5. Bagaimana cara mengubah pymongo.cursor.Cursor menjadi dict?