4

私はまさに流星でこのマップ/リデュース関数が必要です: 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 シェル構文です。meteor には詳しくないので、コードを書きません。お役に立てれば!

于 2013-01-28T18:38:12.897 に答える
1

私はa.jslibを使用して、ここから提案された個別のコード検索を行いました。 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 に答える