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

Đang cố gắng thực hiện nâng cấp hàng loạt với Mongoose. Cách sạch nhất để làm điều này là gì?

( [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ào bulkWrite(,[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ạt MongoError: 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 trong updateOne.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 },


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Loopback hasMany quan hệ không hoạt động trên mongodb

  2. Cách đặt trình điều khiển MongoDB trên XAMPP

  3. MongoDB:khớp tài liệu không trống trong mảng

  4. Giao dịch MongoDB

  5. Rails 4 / Devise / MongoDB:Các tham số không được phép sử dụng các thuộc tính tùy chỉnh và các tham số mạnh