在断言查询中的字段时过滤数据



为什么运行此代码

var userId = Meteor.userId();
var user   = Users.findOne(userId, { fields: { earnings: 1 } });

返回

 { _id: 'Co5bMySeaqySgDP6h', earnings: { period: 0.6, total: 52.5 } }

而不是返回用户的所有字段,包括收入(自定义字段)

另外,有没有办法让用户查询自动返回自定义指定的字段,这样我就不必在每次需要时都手动指定它?

非常感谢

文档中给出了您只获得指定字段(加上 id)的原因:

要在结果文档中包含特定字段,请使用 1 作为值。_id字段仍包含在结果中。

相反,如果您只调用Meteor.users.findOne(userId)它将返回所有可用字段。 如果在服务器上调用,那将是整个文档,但如果在客户端上使用它,它将仅返回从服务器发布的字段,默认情况下,这些字段只是用户名以及emailsprofile字段。 同样,根据文档:

在客户端上

,这将是文档中从服务器发布的字段的子集(其他字段在客户端上不可用)。默认情况下,服务器发布用户名、电子邮件和配置文件(可由用户写入)。有关用户文档中使用的字段的更多信息,请参阅 Meteor.users。

这意味着,如果您已将新字段添加到用户文档中,则需要显式发布该字段才能在客户端上可用(假设已删除自动发布)。 请注意,使用前面讨论的字段说明符执行此操作是可以的,因为其他必需的详细信息(用户名、配置文件)不会被另一个发布函数覆盖,除非您尝试再次发布相同的顶级字段。

Meteor.publish('earnings', function() {
  return Meteor.users.find(this.userId, { fields: { earnings: 1 } });
};

(发布函数希望您返回游标而不是数组,因此即使只有一个结果,您也需要使用 find 而不是findOne)。

最后,可以轻松地

将自己的方法添加到集合中,以使查找所需的内容更加简洁。

Meteor.users.findSimple = function(selector, options) {
  options = options || {};
  options.fields = options.fields || {};
  options.fields.earnings = 1;
  \ same thing for any other fields you want to limit this find to;
  return this.find(selector, options);
};

最新更新