2014-06-05 22 views
8

Tôi muốn thực hiện một yêu cầu như:Chỉ định các trường được trả về trong Node.js/Waterline?

User.find().exec(function(){}); 

Tôi biết tôi có thể sử dụng toJSON trong mô hình tuy nhiên tôi không thích phương pháp này vì đôi khi tôi cần các thông số khác nhau. Ví dụ nếu đó là người dùng đã đăng nhập, tôi sẽ trả lại email của họ và các thông số khác. Tuy nhiên nếu nó yêu cầu pháo đài, cùng một dữ liệu được thực hiện bởi một người dùng khác nhau, nó sẽ không bao gồm email và một tập nhỏ các tham số.

Tôi cũng đã cố gắng sử dụng:

User.find({}, {username:1}) ... 
User.find({}, {fields: {username:1}}); 

Nhưng không có bất kỳ may mắn. Làm cách nào tôi có thể chỉ định các trường tôi cần trả về?

Trả lời

12

Vì vậy, thực sự tìm thấy giải pháp lạ cho việc này. các fields param SẼ làm việc miễn là bạn vượt qua params khác với nó như limit hoặc order:

User.find({}, {fields: {username:1}}).limit(1); 

Lưu ý rằng điều này sẽ không làm việc với findOne hoặc bất kỳ các loại trở về số ít. Điều này có nghĩa là trong kết quả của bạn gọi lại, bạn sẽ cần phải làm người dùng [1].

Tất nhiên, tùy chọn khác là chỉ chà dữ liệu của bạn trên đường ra, đó là một nỗi đau nếu bạn đang sử dụng một danh sách lớn các mục. Vì vậy, nếu bất cứ điều gì này làm việc cho danh sách lớn, nơi bạn thực sự có thể thiết lập limit(20) và cho các mục duy nhất bạn chỉ có thể trả lại một cách rõ ràng paras cho đến khi select() có sẵn.

+0

Điều này có thể vô tình hoạt động với bộ điều hợp Mongo, nhưng nó chắc chắn không phải là giải pháp đáng tin cậy, và mã bạn đăng không cho thấy cách thực sự truy xuất kết quả (ví dụ bằng cách gán mã đó cho một biến và gọi ' exec' trên đó). – sgress454

5

Đường nước hiện không hỗ trợ bất kỳ cú pháp "chọn" nào; nó luôn luôn trả về tất cả các trường cho một mô hình. Hiện tại nó là in development và có thể biến nó thành bản phát hành tiếp theo, nhưng bây giờ cách tốt nhất để làm những gì bạn muốn là sử dụng các phương thức lớp mô hình để tạo các công cụ tìm tùy chỉnh. Ví dụ: User.findUser(criteria, cb) có thể tìm thấy người dùng cung cấp cho criteria và sau đó kiểm tra xem đó có phải là người dùng đã đăng nhập hay không trước khi quyết định dữ liệu nào cần trả về trong cuộc gọi lại.

11

Đây là bản cập nhật cho câu hỏi, trường không còn được sử dụng trong buồm 11, vui lòng sử dụng lựa chọn thay vì trường.

Model.find({field: 'value'}, {select: ['id', 'name']}) 
    .paginate({page: 1}, {limit: 10}) 
    .exec(function(err, results) { 
    if(err) { 
     res.badRequest('reason'); 
    } 
    res.json(results); 
}); 
Các vấn đề liên quan