MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

mongoose:phát hiện xem tài liệu được chèn có phải là bản sao không và nếu có, hãy trả lại tài liệu hiện có

Mặc dù mã của bạn không xử lý được một số trường hợp lỗi và sử dụng find sai chức năng, dòng chảy chung là điển hình cho công việc bạn muốn làm.

  1. Nếu có lỗi khác với lỗi trùng lặp, thì lệnh gọi lại sẽ không được gọi, điều này có thể gây ra sự cố xuống dòng trong ứng dụng NodeJs của bạn
  2. sử dụng findOne thay vì find vì sẽ chỉ có một kết quả cho biết khóa là duy nhất. Nếu không, nó sẽ trả về một mảng.
  3. Nếu cuộc gọi lại của bạn dự kiến ​​là lỗi error truyền thống là đối số đầu tiên, bạn có thể chuyển trực tiếp lệnh gọi lại đến findOne chức năng hơn là giới thiệu một chức năng ẩn danh.
  4. Bạn cũng có thể muốn xem findOneAndUpdate cuối cùng, tùy thuộc vào lược đồ và logic cuối cùng của bạn sẽ là gì.

Như đã đề cập, bạn có thể sử dụng findOneAndUpdate , nhưng với chi phí bổ sung.

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);
}

Tất nhiên vẫn có một lệnh gọi lại, nhưng nó sẽ ghi lại dữ liệu nếu tìm thấy bản sao. Đó có phải là một vấn đề thực sự phụ thuộc vào các trường hợp sử dụng hay không.

Tôi đã làm sạch một chút mã của bạn ... nhưng nó thực sự khá đơn giản và lệnh gọi lại phải rõ ràng. callback hàm luôn nhận được tài liệu mới được lưu hoặc tài liệu đã được so khớp dưới dạng bản sao. Đó là trách nhiệm của hàm gọi saveNewValue để kiểm tra lỗi và xử lý đúng cách. Bạn sẽ thấy cách tôi cũng đã đảm bảo rằng lệnh gọi lại được gọi bất kể loại lỗi nào và luôn được gọi với kết quả theo một cách nhất quán.

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);
    });
}

Ngoài ra, bạn có thể sử dụng lời hứa họa tiết. Ví dụ này đang sử dụng 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. làm thế nào để lưu dataframe trong mongodb bằng cách sử dụng pyspark?

  2. Phản ứng các yêu cầu POST với Express / Node và MongoDB

  3. Nhập tài liệu vào MongoDB từ một mảng tài liệu JSON

  4. Làm cách nào để lấy lại giá trị mới sau khi cập nhật trong một mảng được nhúng?

  5. Các tài liệu lồng nhau trong MongoDB Java không thể truy cập được bằng cách sử dụng dấu chấm trong tên khóa