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

Mongoose có nâng cấp hoạt động cập nhật / gia hạn các giá trị lược đồ mặc định không?

Nếu bạn đang tìm kiếm "bằng chứng" về hành vi mong đợi, thì không cần tìm đâu xa hơn chính mã nguồn. Đặc biệt trong schema.js mã> định nghĩa chính :

cập nhật
        updates.$setOnInsert = {};
        updates.$setOnInsert[createdAt] = now;
      }

      return updates;
    };

    this.methods.initializeTimestamps = function() {
      if (createdAt && !this.get(createdAt)) {
        this.set(createdAt, new Date());
      }
      if (updatedAt && !this.get(updatedAt)) {
        this.set(updatedAt, new Date());
      }
      return this;
    };

    this.pre('findOneAndUpdate', _setTimestampsOnUpdate);
    this.pre('update', _setTimestampsOnUpdate);
    this.pre('updateOne', _setTimestampsOnUpdate);
    this.pre('updateMany', _setTimestampsOnUpdate);
  }

  function _setTimestampsOnUpdate(next) {
    var overwrite = this.options.overwrite;
    this.update({}, genUpdates(this.getUpdate(), overwrite), {
      overwrite: overwrite
    });
    applyTimestampsToChildren(this);
    next();
  }

Vì vậy, ở đó bạn có thể thấy tất cả 'pre' trình xử lý phần mềm trung gian đang được đăng ký cho từng biến thể của phương pháp "cập nhật" và cho cùng một mã chức năng. Tất cả những điều này về cơ bản đều sửa đổi $ set trong bất kỳ "bản cập nhật" nào bạn phát hành để bao gồm updatedAt trường hoặc bất kỳ tên nào bạn đã ánh xạ tới khóa đó trong các tùy chọn lược đồ.

Báo cáo thực tế được gửi với các hành động "upert" sử dụng $ setOnInsert cho createdAt trường hoặc tên tùy chọn được ánh xạ (xem phần trên cùng của danh sách). Hành động này chỉ áp dụng khi "nâng cấp" thực sự xảy ra, vì vậy, các tài liệu tồn tại và chỉ phù hợp với bất kỳ phương pháp "cập nhật" nào không bao giờ thực sự cảm động bởi giá trị này.

Các toán tử đó là một phần của cách MongoDB hoạt động và không thực sự liên quan đến mongoose, nhưng đoạn mã hiển thị ở đây cho thấy cách mongoose "điều chỉnh" các hành động "cập nhật" của bạn để bao gồm các hoạt động bổ sung này.

Để tham khảo toàn bộ hàm chính trong schema.js việc tìm hiểu những gì cần áp dụng hiện bắt đầu tại Dòng # 798 cho genUpdates () hàm như được gọi ở phần dưới cùng của danh sách được hiển thị ở đây nhưng phần trên cùng là vài dòng cuối cùng của hàm đó nơi các phím của $ setOnInsert được xác định.

Vì vậy, tóm lại, CÓ mọi hành động "cập nhật" là có chủ ý rằng updatedAt trường được ánh xạ có Ngày hiện tại giá trị được chỉ định và "các bản cập nhật" cũng được sửa đổi để bao gồm $ setOnInsert hành động chỉ áp dụng khi tài liệu mới được tạo do hành động "nâng cấp" cho createdAt trường được ánh xạ.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. return database_name ==':memory:' hoặc 'mode =memory' trong database_name TypeError:đối số kiểu 'WindowsPath' không thể lặp lại

  2. Chuyển đổi MongoCursor từ -> find () thành một mảng

  3. Làm thế nào để $ push một trường tùy thuộc vào một điều kiện?

  4. $ chiếu trong mongoDB findOneAndUpdate ()

  5. MongoDB - Kéo nhiều đối tượng từ một mảng