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

Mongoose:có chuyện gì với _doc?

Cập nhật

Có thể tôi đã hiểu nhầm câu hỏi ban đầu của bạn, nhưng bây giờ có vẻ như bản chất câu hỏi của bạn đã thay đổi, vì vậy thông tin bên dưới không liên quan, nhưng tôi sẽ bỏ qua. :)

Tôi đã kiểm tra mã của bạn và nó hoạt động tốt đối với tôi. Mongoose không thực thi bất kỳ mã đặc biệt nào khi bạn đặt các thuộc tính không phải là một phần của lược đồ (hoặc một vài thuộc tính đặc biệt khác). JavaScript hiện không hỗ trợ mã gọi cho các thuộc tính chưa tồn tại (vì vậy Mongoose không thể cản đường tập hợp goo tài sản chẳng hạn).

Vì vậy, khi bạn đặt thuộc tính:

foo.goo = { c: 1 };

Mongoose không tham gia. Nếu console.log của bạn là một cái gì đó khác với mã bạn đã hiển thị, tôi có thể thấy rằng nó có thể báo cáo không chính xác.

Ngoài ra, khi bạn send kết quả trả về dưới dạng JSON, JSON.stringify đang được gọi, gọi toString trên Mô hình Mongoose của bạn. Khi điều đó xảy ra, Mongoose chỉ sử dụng các thuộc tính được xác định trên lược đồ. Vì vậy, không có thuộc tính bổ sung nào được gửi lại theo mặc định. Bạn đã thay đổi bản chất của data mặc dù mảng để trỏ trực tiếp vào dữ liệu Mongoose, vì vậy nó tránh được vấn đề đó.

Chi tiết về hành vi bình thường

Khi bạn đặt thuộc tính goo sử dụng Mongoose, có khá nhiều điều xảy ra. Mongoose tạo getters / setters thuộc tính thông qua Object.defineProperty (một số tài liệu ). Vì vậy, khi bạn đặt goo thuộc tính mà bạn đã xác định là [String] , một vài điều xảy ra:

  1. Mã Mongoose được gọi trước khi giá trị được đặt vào phiên bản đối tượng (không giống như một đối tượng JavaScript đơn giản)
  2. Mongoose tạo một mảng (tùy chọn) để lưu trữ dữ liệu (MongooseArray ) sẽ chứa dữ liệu mảng. Trong ví dụ bạn cung cấp, vì bạn không chuyển một mảng nên mảng đó sẽ được tạo.
  3. Mongoose sẽ cố gắng truyền dữ liệu của bạn đến đúng loại
  4. Nó sẽ gọi toString trên dữ liệu được truyền như một phần của quá trình truyền.

Vì vậy, kết quả là tài liệu hiện chứa một mảng có toString phiên bản của đối tượng bạn đã chuyển.

Nếu bạn đã kiểm tra nội dung của goo , bạn sẽ thấy rằng bây giờ nó là một mảng với một phần tử duy nhất, là một chuỗi chứa [object Object] . Nếu bạn chọn một loại cơ bản hơn hoặc phù hợp với loại lưu trữ thuộc tính đích, bạn sẽ thấy rằng kiểm tra bình đẳng cơ bản sẽ hoạt động.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Toán tử MongoDB $

  2. Làm cách nào để lấy Dữ liệu từ MongoDb bằng mongoose?

  3. Mối quan hệ nhiều-nhiều trong CouchDB hoặc MongoDB

  4. MongoDB:Tính toán thời gian dừng giữa mỗi lần thay đổi giá trị trạng thái

  5. HOẶC kết hợp truy vấn nil hoặc với Mongoid vẫn phù hợp?