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:
- 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)
- 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. - Mongoose sẽ cố gắng truyền dữ liệu của bạn đến đúng loại
- 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.