4

我需要流星中的这个 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
)

我找到了这个问题/答案,但我不能让它做我不想做的事情:
Meteor 是否有一个独特的集合查询?

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

4

3 回答 3

8

目前,最优雅的解决方案是聚合框架

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 语法。我对流星不熟悉,所以我不会尝试编写一些代码。希望这可以帮助!

于 2013-01-28T18:38:12.897 回答
2

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

拉取请求 #644中概述了您可能会发现有用的另一个解决方案。

于 2013-08-04T09:22:23.423 回答
1

我使用 a.js 库从这里建议了不同的代码搜索。 Meteor 对集合有不同的查询吗?

还有这个丑陋的:

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 方法可用,我将交换代码。但是对于原型设计,这是可行的。谢谢大家。

于 2013-01-28T20:22:05.237 回答