【问题标题】:collection.find "fields" option interfere with "selector" argumentcollection.find "fields" 选项干扰 "selector" 参数
【发布时间】:2026-02-05 11:45:01
【问题描述】:

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

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),
       ...
   }]

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

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

    console.log users.fetch()

>> []

所以问题是:

  1. “find”方法是否只查询包含在结果游标中的字段?
  2. 如果是这样,为每个用户发布字段子集的最佳做法是什么?

更新: 正如 Andrew Mao 所注意到的,我在使用 CoffeeScript 语法时犯了一个错误。如果没有前面的逗号,我的 fields 选项是第一个参数对象的一部分。正确的方法调用应该如下:

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

【问题讨论】:

    标签: coffeescript meteor


    【解决方案1】:

    您正在使用 Coffeescript 并在其语法上犯了一个错误。 fields 必须是 find 的第二个参数中的键,而不是第一个。一种写法是

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

    上面所有的花括号实际上都是可选的,只是用来显示结构。一旦您对咖啡脚本更加熟悉,就可以省略它们。但是那个最重要的逗号必须在你的论点之间的某个地方。

    【讨论】:

    • 谢谢你,安德鲁!你是绝对正确的。在fields 之前插入带逗号的行并添加意图解决了问题。
    • 呃,那个咖啡稿。我害怕这是 livedata 中的一个错误 :)
    • @imslavko Coffeescript 只是一种更快捷的 JavaScript 编写方式。不过,非常适合在脚上射击自己。