Bạn có hai lựa chọn thực sự ở đây tùy thuộc vào cách bạn muốn xử lý mọi việc:
-
Sử dụng nâng cấp chức năng của MongoDB về cơ bản là "tra cứu" nếu dữ liệu quan trọng tồn tại. Nếu không thì bạn chỉ chuyển dữ liệu vào
$setOnInsert
và điều đó sẽ không đụng đến bất cứ thứ gì khác. -
Sử dụng các hoạt động "Không có thứ tự" trong Hàng loạt. Toàn bộ đợt cập nhật sẽ tiếp tục ngay cả khi lỗi được trả lại, nhưng (các) báo cáo lỗi chỉ có vậy và bất kỳ thứ gì không phải là lỗi sẽ được đưa vào.
Toàn bộ ví dụ:
var async = require('async'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;
var testSchema = new Schema({
"_id": Number,
"name": String
},{ "_id": false });
var Test = mongoose.model('Test',testSchema,'test');
mongoose.connect('mongodb://localhost/test');
var data = [
{ "_id": 1, "name": "One" },
{ "_id": 1, "name": "Another" },
{ "_id": 2, "name": "Two" }
];
async.series(
[
// Start fresh
function(callback) {
Test.remove({},callback);
},
// Ordered will fail on error. Upserts never fail!
function(callback) {
var bulk = Test.collection.initializeOrderedBulkOp();
data.forEach(function(item) {
bulk.find({ "_id": item._id }).upsert().updateOne({
"$setOnInsert": { "name": item.name }
});
});
bulk.execute(callback);
},
// All as expected
function(callback) {
Test.find().exec(function(err,docs) {
console.log(docs)
callback(err);
});
},
// Start again
function(callback) {
Test.remove({},callback);
},
// Unordered will just continue on error and record an error
function(callback) {
var bulk = Test.collection.initializeUnorderedBulkOp();
data.forEach(function(item) {
bulk.insert(item);
});
bulk.execute(function(err,result) {
callback(); // so what! Could not care about errors
});
},
// Still processed the whole batch
function(callback) {
Test.find().exec(function(err,docs) {
console.log(docs)
callback(err);
});
}
],
function(err) {
if (err) throw err;
mongoose.disconnect();
}
);
Lưu ý rằng "hành động đã thay đổi" trong các trình điều khiển hiện tại là phản hồi kết quả trên .execute()
sẽ trả về một đối tượng lỗi sẽ được ném, trong đó các bản phát hành trước không làm như vậy với các hoạt động "Chưa được sắp xếp".
Điều này làm cho mã của bạn không bao giờ được dựa vào err
được trả về một mình và bạn phải inpspeting result
được trả về thay vào đó để phân loại đầy đủ các lỗi.
Tuy nhiên, khi không có thứ tự thì lô tiếp tục cho đến hết, cho dù có bao nhiêu lỗi xảy ra. Những thứ không phải là lỗi sẽ được thực hiện như bình thường.
Điều này thực sự đi xuống thành "là trình tự quan trọng". Nếu vậy, bạn cần các thao tác "Có thứ tự" và bạn chỉ có thể tránh các khóa trùng lặp bằng cách sử dụng "cảnh báo". Nếu không, hãy sử dụng "không có thứ tự", nhưng hãy lưu ý các lỗi trả về và ý nghĩa thực sự của chúng.
Ngoài ra, khi sử dụng .collection
để lấy đối tượng thu thập cơ bản từ trình điều khiển cơ sở để bật hoạt động "Bulk", sau đó luôn đảm bảo rằng phương thức mongoose "some" luôn được gọi trước.
Nếu không có điều đó, sẽ không có kết nối được đảm bảo đến cơ sở dữ liệu với các phương thức trình điều khiển gốc vì nó được xử lý cho các phương thức mongoose, do đó, hoạt động sẽ không thành công do không có kết nối.
Phương pháp thay thế để "kích hoạt" một phương thức mongoose trước tiên, là bọc logic ứng dụng của bạn trong một trình xử lý sự kiện cho kết nối:
mongoose.connection.on("open",function(err) {
// app logic in here
})