( [email protected] , [email protected] )
TL; DR
await GasStation.collection.bulkWrite([ // <<==== use the model name
{
'updateOne': {
'filter': { 'id': '<some id>' },
'update': { '$set': { /* properties to update */ } },
'upsert': true, // <<==== upsert in every document
}
},
/* other operations here... */
]);
Câu chuyện dài:
Sau khi vật lộn với tài liệu nghèo nàn về API Mongoose
, Tôi đã giải quyết nâng cấp hàng loạt tinh chỉnh updateOne:{}
trong bulkWrite()
phương pháp.
Một số điều không có giấy tờ cần xem xét:
// suppose:
var GasStation = mongoose.model('gasstation', gasStationsSchema);
var bulkOps = [ ];
// for ( ... each gasStation to upsert ...) {
let gasStation = { country:'a', localId:'b', xyz:'c' };
// [populate gasStation as needed]
// Each document should look like this: (note the 'upsert': true)
let upsertDoc = {
'updateOne': {
'filter': { 'country': gasStation.country, 'localId': gasStation.localId },
'update': gasStation,
'upsert': true
}};
bulkOps.push(upsertDoc);
// end for loop
// now bulkWrite (note the use of 'Model.collection')
GasStation.collection.bulkWrite(bulkOps)
.then( bulkWriteOpResult => {
console.log('BULK update OK');
console.log(JSON.stringify(bulkWriteOpResult, null, 2));
})
.catch( err => {
console.log('BULK update error');
console.log(JSON.stringify(err, null, 2));
});
Hai điều quan trọng ở đây là các vấn đề tài liệu API chưa hoàn chỉnh (ít nhất là tại thời điểm viết bài):
-
'upsert': true
trong mỗi tài liệu . Điều này không được ghi lại trong Mongoose API (), thường đề cập đến node-mongodb-native người lái xe. Xem xét updateOne trong trình điều khiển này , bạn có thể nghĩ đến việc thêm'options':{'upsert': true}
, nhưng, không ... điều đó sẽ không làm được. Tôi cũng đã cố gắng thêm cả hai trường hợp vàobulkWrite(,[options],)
đối số, cũng không có tác dụng. -
GasStation.collection.bulkWrite()
. Mặc dù phương thức Mongoose BulWrite () tuyên bố nó phải được gọi làModel.bulkWrite()
(trong trường hợp này,GasStation.bulkWrite()
), điều đó sẽ kích hoạtMongoError: Unknown modifier: $__
. Vì vậy,Model.collection.bulkWrite()
phải được sử dụng.
Ngoài ra, lưu ý:
-
Bạn không cần sử dụng$set
toán tử mongo trongupdateOne.update
, vì mongoose xử lý trường đó trong trường hợp upert (xem ví dụ về nhận xét về số lượng lớnWrite () ). - Lưu ý rằng chỉ mục duy nhất của tôi trong giản đồ (cần thiết để nâng cấp hoạt động bình thường) được định nghĩa là:
gasStationsSchema.index({ country: 1, localId: 1 }, { unique: true });
Hy vọng nó sẽ hữu ích.
==> CHỈNH SỬA:(Mongoose 5?)
Như đã nhận thấy bởi @JustinSmith, $set
toán tử do Mongoose thêm vào dường như không hoạt động nữa. Có lẽ là do Mongoose 5?
Trong mọi trường hợp, sử dụng $set
rõ ràng nên làm:
'update': { '$set': gasStation },