collection.find“fields”选项会干扰“selector”参数

时间:2014-01-31 16:36:44

标签: coffeescript meteor

我想向我的客户发布在线用户列表,并且出于安全原因排除除“用户名”属性以外的所有用户。我有以下服务器端发布:

Meteor.publish 'onlineUsers', ->
    users = Meteor.users.find
        "services.resume.loginTokens.0":
            $exists: true

它工作正常,产生以下输出:

console.log users.fetch()

>> [{ 
       id: 'kFney2anhwZC4w4zX',
       createdAt: Fri Jan 31 2014 20:04:40 GMT+0400 (MSK),
       <...>
   }, 
   {   _id: 'tLNbhoqCex46v5L7s',
       createdAt: Fri Jan 31 2014 20:05:04 GMT+0400 (MSK),
       ...
   }]

但是当我添加“fields”选项来发布参数时,结果是一个空列表:

Meteor.publish 'onlineUsers', ->
    users = Meteor.users.find
        "services.resume.loginTokens.0":
            $exists: true
        fields:
            username: true

    console.log users.fetch()

>> []

所以问题是:

  1. “find”方法是否仅查询结果光标所包含的字段?
  2. 如果是这样,为每个用户发布字段子集的最佳做法是什么?
  3. UPD: 正如Andrew Mao注意到的那样,我在使用CoffeeScript语法时遇到了错误。如果没有前面的逗号,则fields选项是第一个参数对象的一部分。正确的方法调用应该如下:

    Meteor.users.find
        "services.resume.loginTokens.0":
            $exists: true
        , 
            fields:
                username: true
    

1 个答案:

答案 0 :(得分:0)

您正在使用Coffeescript并使用其语法出错。 fields需要成为find的第二个参数的关键,而不是第一个参数。你可以写的一种方法是

Meteor.publish 'onlineUsers', ->
    users = Meteor.users.find {"services.resume.loginTokens.0": {$exists: true}},
        { fields:
            { username: true }
        }

上面所有花括号实际上都是可选的,只是用来显示结构。一旦你更熟悉coffeescript,你可以省略它们。但是那个非常重要的逗号必须在你的论点之间。