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

luwak:mendeteksi jika dokumen yang dimasukkan adalah duplikat dan jika demikian, kembalikan dokumen yang ada

Meskipun kode Anda tidak menangani beberapa kasus kesalahan, dan menggunakan find . yang salah fungsi, aliran umum adalah tipikal memberikan pekerjaan yang ingin Anda lakukan.

  1. Jika ada kesalahan selain duplikat, panggilan balik tidak akan dipanggil, yang kemungkinan akan menyebabkan masalah hilir di aplikasi NodeJs Anda
  2. gunakan findOne daripada find karena hanya akan ada satu hasil yang diberikan kuncinya unik. Jika tidak, itu akan mengembalikan sebuah array.
  3. Jika panggilan balik Anda mengharapkan error tradisional sebagai argumen pertama, Anda bisa langsung meneruskan panggilan balik ke findOne fungsi daripada memperkenalkan fungsi anonim.
  4. Anda mungkin juga ingin melihat findOneAndUpdate pada akhirnya, tergantung pada skema dan logika akhir Anda.

Seperti yang disebutkan, Anda mungkin dapat menggunakan findOneAndUpdate , tetapi dengan biaya tambahan.

function save(id, title, callback) {
    Value.findOneAndUpdate(
       {id: id, title: title}, /* query */
       {id: id, title: title}, /* update */
       { upsert: true}, /* create if it doesn't exist */
       callback);
}

Masih ada panggilan balik tentu saja, tetapi akan menulis data lagi jika duplikat ditemukan. Masalah apakah itu benar-benar tergantung pada kasus penggunaan.

Saya telah melakukan sedikit pembersihan kode Anda... tetapi sebenarnya cukup sederhana dan panggilan baliknya harus jelas. callback ke fungsi selalu menerima dokumen yang baru disimpan atau yang cocok sebagai duplikat. Ini adalah tanggung jawab fungsi yang memanggil saveNewValue untuk memeriksa kesalahan dan menanganinya dengan benar. Anda akan melihat bagaimana saya juga memastikan bahwa panggilan balik dipanggil terlepas dari jenis kesalahannya dan selalu dipanggil dengan hasil yang konsisten.

function saveNewValue(id, title, callback) {
    if (!callback) { throw new Error("callback required"); }
    var thisValue = new models.Value({
        id:id,
        title:title //this is a unique value
    });

    thisValue.save(function(err, product) {
        if (err) {
            if (err.code === 11000) { //error for dupes
                return models.Value.findOne({title:title}, callback);
            }            
        }    
        callback(err, product);
    });
}

Atau, Anda dapat menggunakan janji pola. Contoh ini menggunakan when.js .

var when = require('when');

function saveNewValue(id, title) {
    var deferred = when.defer();

    var thisValue = new models.Value({
        id:id,
        title:title //this is a unique value
    });

    thisValue.save(function(err, product) {
        if (err) {
            if (err.code === 11000) { //error for dupes
                return models.Value.findOne({title:title}, function(err, val) {
                    if (err) {
                        return deferred.reject(err);
                    }
                    return deferred.resolve(val);
                });
            }
            return deferred.reject(err);
        }
        return deferred.resolve(product);
    });

    return deferred.promise;
}

saveNewValue('123', 'my title').then(function(doc) {
    // success
}, function(err) {
    // failure
});


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB - Menyimpan tanggal tanpa zona waktu

  2. Bagaimana cara menggunakan variabel sebagai nama bidang di mongodb-native findOne()?

  3. Driver MongoDB C# dan bidang DateTime

  4. Mongodb:menghitung connectToField di dalam graphlookup

  5. Meteor:terbitkan 2 proyeksi berbeda dari elemen array