要包装其他答案中提到的转换,您可以使用我开发的包meteor-middleware。它为此提供了一个很好的可插拔 API。因此,您可以将它们一个一个堆叠起来,而不是仅仅提供一个转换。这允许代码重用、权限检查(如根据权限删除或聚合字段)等。因此您可以创建一个类,允许您以您想要的方式聚合文档。
但是对于您的特定情况,您可能需要查看MongoDB 聚合管道。如果确实有很多单词,您可能不想将它们全部从 MongoDB 服务器传输到 Meteor 服务器端。另一方面,聚合管道缺乏您可能想要的反应性。因此,随着文字的进出,已发布的文档会发生变化。
为了解决这个问题,您可以使用我开发的另一个包PeerDB。它允许您指定触发器,这些触发器将在数据更改时被响应调用,并存储在数据库中。然后,您可以简单地使用正常发布将计数发送给客户端。缺点是所有用户都应该对同一个集合感兴趣。它适用于全球,而不是每个用户。但是,如果您对整个集合的字数感兴趣,您可以执行以下操作(在 CoffeesScript 中):
class WordCounts extends Document
@Meta
name: 'WordCounts'
class Words extends Document
@Meta
name: 'Words'
triggers: =>
countWords: @Trigger ['word'], (newDocument, oldDocument) ->
# Document has been removed.
if not newDocument._id
WordCounts.update
length: oldDocument.word.length
,
$inc:
count: -1
# Document has been added.
else if not oldDocument._id
WordCounts.update
length: newDocument.word.length
,
$inc:
count: 1
# Word length has changed.
else if newDocument.word.length isnt oldDocument.word.length
WordCounts.update
length: oldDocument.word.length
,
$inc:
count: -1
WordCounts.update
length: newDocument.word.length
,
$inc:
count: 1
然后您可以简单地发布WordCounts
文档:
Meteor.publish 'counts', ->
WordCounts.documents.find()