【问题标题】:How to publish a mongodb array length as an additional collection field?如何将 mongodb 数组长度发布为附加集合字段?
【发布时间】:2015-08-16 00:11:59
【问题描述】:

我有一个包含以下字段的 mongodb 集合:

  • _id
  • name(字符串)
  • [items](字符串数组)
  • secret(布尔值)

我只想发布所有 _id、name 字段和 item 数组长度(不包括 secret 字段),其中 secret 字段为 true。

我在某处读到可以在我的查找查询中添加其他文档属性,但我的 google foo 不起作用。

这是我的发布方法的样子没有额外的items_count 属性:

Meteor.publish("all_items", function() {
    return myItems.find(
                 {secret: true},
                 {fields:
                   {_id:1,name:1}
                 });
        });

如何从我的出版物中的 [item] 长度创建一个附加字段?

编辑:看来我需要使用aggregate 函数和$projectoperator。并且它不受流星的支持。

谁能向我确认这一点(即这是唯一的选择,不支持)?

【问题讨论】:

  • “这是唯一的选择 [...] ?” 不,您可以使用 map-reduce。 Meteor 支持吗?
  • 我仍然不清楚高级功能 map reduce。我需要首先学习减少,我没有正确理解它。同时,我会尝试@n9code提供的解决方案

标签: arrays mongodb meteor


【解决方案1】:

您可以add aggregation framework support to Meteor,然后使用带有$project 阶段的简单聚合管道,就像您提到的那样:

myItems.aggregate(
    [
       {$match: {secret: true}},
       {$project: {_id: 1, name: 1, items_count: {$size: '$items'}}}
    ]
)

【讨论】:

  • 不错的解决方案,但是对于流星,您应该提到要发布它需要 1)将聚合结果数组存储在变量中,2)迭代返回数组的每个项目,3 ) 在循环中,使用 this.added('nameOfClientCollection', Random.id(), {your: databaseFields}); 将它们一一添加到您的出版物中4) 使用 this.ready() 使发布可用。我验证答案
  • 感谢您的补充。
猜你喜欢
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多