在Node.js / Waterline中指定返回的字段?

时间:2014-06-05 19:01:07

标签: node.js express sails.js waterline

我想发出如下请求:

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

我知道我可以在模型中使用toJSON但是我不喜欢这种方法,因为有时我需要不同的参数。例如,如果是登录用户,我将返回他们的电子邮件和其他参数。但是,如果请求相同的数据是由不同的用户制作的,那么它将不包括电子邮件和较小的参数子集。

我也尝试过使用:

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

但没有运气。如何指定我需要返回的字段?

3 个答案:

答案 0 :(得分:12)

所以实际上找到了一个奇怪的解决方法。只要您通过fieldslimit传递其他参数,order参数就会起作用:

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

请注意,这不适用于findOne或任何单一返回类型。这意味着在结果回调中,您需要执行用户[1]。

当然,另一个选择是在出路时擦除您的数据,如果您使用大量项目,这将是一个痛苦。因此,如果有任何内容适用于您可能实际设置limit(20)的大型列表,而对于单个项目,您可以在select()可用之前明确返回段落。

答案 1 :(得分:11)

这是问题的更新,在帆11中不再使用字段,请使用select而不是字段。

Model.find({field: 'value'}, {select: ['id', 'name']})
  .paginate({page: 1}, {limit: 10})
  .exec(function(err, results) {
    if(err) {
      res.badRequest('reason');
    }
    res.json(results);
});

答案 2 :(得分:5)

Waterline目前不支持任何“select”语法;它总是返回模型的所有字段。它目前是in development并且可以进入下一个版本,但是现在做你想要的最好的方法是使用模型类方法来制作自定义查找器。例如,User.findUser(criteria, cb)可以找到用户提供criteria,然后在决定在回调中返回哪些数据之前检查它是否是登录用户。