Tôi biết câu trả lời này đã được chấp nhận, nhưng tôi muốn chỉ ra rằng mongoose chăm sóc hầu hết việc truyền cho bạn ... phần lớn thời gian. Mặc dù nó rất tiện lợi, nhưng nó trừu tượng hóa hành vi thực sự của mongo. Ví dụ, cầy mangut cho phép bạn làm điều gì đó như thế này:
PersonModel.findById("4cdf00000000000000007822", ...);
Tuy nhiên, nếu bạn đã cố gắng để truy vấn cơ sở dữ liệu trực tiếp (không có cầy mangut), điều này sẽ không công việc:
PersonCollection.find({_id: "4cdf00000000000000007822"}, ...);
Điều này là do ObjectIds không phải là chuỗi ... chúng là đối tượng. Bên trong, cầy mangut chuyển đổi mà chuỗi đến một ObjectId và sau đó thực hiện một truy vấn đối với cơ sở dữ liệu để truy vấn cuối cùng trông kinda như thế này:
PersonCollection.find({_id: ObjectId("4cdf00000000000000007822")}, ...);
Ngoài ra, mỗi con đường trong một sơ đồ có một phương pháp "caster". Đây là một phương pháp riêng tư, nhưng nó darn tiện dụng khi bạn cần nó. XIN LƯU Ý R THENG caster
PHƯƠNG PHÁP MÔ TẢ DƯỚI DƯỚI DƯỚI ĐÂY VÀ CÓ THỂ THAY ĐỔI KHÔNG CẢNH BÁO. SỬ DỤNG RỦI RO RIÊNG CỦA BẠN (xin lỗi vì đã la hét):
// Use PersonModel.schema.paths() to get all paths and loop over them if you want
var key = "name";
var pathObj = PersonModel.schema.path(key);
if(!pathObj) pathObj = PersonModel.schema.virtualpath(key);
if(!pathObj) { /* not found: return, continue, exit, whatever */ }
// UNDOCUMENTED: USE AT YOUR OWN RISK
var caster = pathObj.caster || pathObj;
var castedValue = caster.cast(req.body.name);
Tại sao tôi biết điều này? Bởi vì nếu bạn muốn sử dụng một số tính năng nâng cao hơn của mongo như tập hợp, bạn sẽ cần phải đúc các giá trị của riêng bạn khi bạn xây dựng đường dẫn. Tôi cũng cần phải tự đúc các giá trị cho các truy vấn nhất định sử dụng toán tử $in
... có thể điều này không cần thiết nữa. Điểm là, nếu bạn gặp khó khăn khi nhận kết quả mong đợi, hãy thử tự mình đúc các giá trị.
_ "Chú ý rằng đối tượng đầu tiên xuất phát từ yêu cầu, do đó nó được tạo thành hoàn toàn bằng chuỗi." _ - Tại sao bạn không thay đổi nó để trả về một số và boolean ở những vị trí thích hợp? Việc bạn sử dụng "như vậy" trong câu tôi trích dẫn ngụ ý chỉ có chuỗi được phép, nhưng điều đó không đúng nếu đó là JSON. (Tức là, JSON chính nó là một định dạng dựa trên chuỗi, nhưng nó có thể _represent_ số và booleans, và khi JSON được phân tích cú pháp các thuộc tính như vậy trở thành số và booleans ...) – nnnnnn
Các thuộc tính trong lược đồ của bạn có cố định hay không họ năng động? – Mahn
@nnnnnn Vâng, vấn đề là Express lấy thông tin từ biểu mẫu 'myObject [name]: name, myObject [someNumber]: 23', và Express tự xây dựng myObject theo mặc định thiết lập mọi thuộc tính thành một String! – renatoargh