【问题标题】:How to collect all tags and count these in Meteor如何在 Meteor 中收集所有标签并计算它们
【发布时间】:2013-01-28 18:09:21
【问题描述】:

我在meteor中需要这个map/reduce函数: http://cookbook.mongodb.org/patterns/count_tags/

从所有条目中读取所有标签,并返回包含集合中数量的唯一标签列表

我将如何实现这一点。我正在使用独立的MongoDB。 集合布局:

[_id] => 1234
[headline] => My First Post
[body] => Alot of stuff
[isPrivat] => 
[tags] => Array (
    [0] => test
    [1] => php
    [2] => perl
)

我找到了这个问题/答案,但我不能让它做我不想做的事情:
Does Meteor have a distinct query for collections?

什么是最优雅的方式来做到这一点。 感谢您的宝贵时间

【问题讨论】:

  • 你试过用underscore.js'groupBy方法吗?
  • 这给了我唯一的条目,但到目前为止还没有计数:var taglist = Posts.find({}).distinct("tags"); taglist = _.uniq(_.flatten(_.pluck(taglist, 'tags')));

标签: mongodb meteor


【解决方案1】:

目前,最优雅的解决方案是aggregation framework

db.items.aggregate(
    { $unwind : "$tags" },
    { $group : {
        _id : "$tags",
        count: { $sum : 1 }
    }}
);

它会输出这样的结果:

{ "result" : [ 
    { "_id" : "perl",
      "count" : 2 }, 
    { "_id" : "php",
      "count" : 1 }, 
    { "_id" : "test",
      "count" : 1 }],
  "ok" : 1 }

这是 mongodb shell 语法。我对流星不熟悉,所以我不会尝试编写一些代码。希望这会有所帮助!

【讨论】:

  • 不幸的是,minimongo 驱动程序存在一些限制。不支持 findAndModify、upsert、聚合函数和 map/reduce。否则那将是非常优雅的。
  • 是否可以使用其他支持聚合框架的驱动程序?
  • 将此答案与meteorhacks:aggregate 一起使用似乎效果很好。
  • @Johannes 你最终如何在流星中处理这个问题?
【解决方案2】:

您可以尝试meteor-mongo-extensions 智能包,它为 Meteor 实现了 MongoDB 的一些聚合框架功能(免责声明:我自己没有尝试过)。

pull request #644 中概述了您可能会发现有用的另一个解决方案。

【讨论】:

    【解决方案3】:

    我使用 a.js 库从这里建议了不同的代码搜索。 Does Meteor have a distinct query for collections?

    还有这个丑陋的:

    Template.Tag.taglist = function () {
    
        var taglist = Posts.find({}).distinct("tags");
        taglist = _.compact(_.flatten(_.pluck(taglist, 'tags')));
        // reformat, count and filter doublets 
        function counttags(arr) {
            var a = [], b = [], prev;
            arr.sort();
            for ( var i = 0; i < arr.length; i++ ) {
                if ( arr[i] !== prev ) {
                    a.push(arr[i]);
                    b.push(1);
                } else {
                    b[b.length-1]++;
                }
                prev = arr[i];
            }
            result = _.zip(a,b);
            return result;
        }
        var taglist = counttags(taglist);
    
        //console.log(taglist);
    
        return taglist;
    };
    

    和(简化的)模板:

    <template name="Tag">
        {{#each taglist}}
            {{this.[0]}}x {{this.[1]}}
        {{/each}}
     </template>
    

    不是很漂亮。一旦聚合或 map/reduce 方法可用,我将交换代码。但是对于原型设计,这是可行的。谢谢大家。

    【讨论】:

      猜你喜欢
      • 2022-11-11
      • 2021-01-25
      • 2020-03-16
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 2019-08-08
      相关资源
      最近更新 更多