1

フィルター フィールドを含むドキュメントを含む MongoDB データベースがあります。ドキュメントは次のようになります。

{
   "_id": ObjectId("503208f5b5db0135387d9249"),
   "name": "name1",
   "filter": "facebook"
}          {
   "_id": ObjectId("503208f5b5db0135387d9249"),
   "name": "name2",
   "filter": "twitter"
}  
{
   "_id": ObjectId("503208f5b5db0135387d9249"),
   "name": "name3",
   "filter": "twitter"
}    

そして、種類別に数えたい。この例は次のようになります。

facebook => 1, twitter => 2

ruby コードでは、カウントが非常に遅いです。

フィルターは文字列で、何でもかまいません。例えば:

{facebook : 1203, twitter : 201, wherever : 200, othertype : 400}

私はmongoマッパー(ルビードライバー)を使用しています。

============== 編集3

最後にそれは働いています。ruby ドライバーのコードは次のとおりです。

def map  
    'function(){  
        emit(this.plataforma, 1);
    }'  
end   
def reduce   
    '
    function(prev, current) {  
        var n = 0;
        current.forEach(function(v){
            n+=v;
        });
        return n; 
    }'
end 

def build  
    Mention.collection.map_reduce(map, reduce, :query => {})  
end 
4

3 に答える 3

0

私は質問をしましたが、答えはありませんでした。したがって、フィルタの可能性が facebook と twitter の 2 つしかない場合は、次の 2 つのクエリでこれを行うことができます。

db.yourcollection.count({
  'filter' : 'facebook'
})

これはあなたを返します 1

db.yourcollection.count({
  'filter' : 'twitter'
})

これはあなたを返します 2

于 2012-10-25T11:36:24.200 に答える
0

これは次のようになります: http://cookbook.mongodb.org/patterns/count_tags/

どこで、次のように MR を実行する方法を示しています。

var map = function(){
    emit(this.filter,1);
}

var reduce  = function(previous,current){
    var count = 0;

    for (index in current) {
        count += current[index];
    }

    return count;
}

次に、次の形式のドキュメントを別のコレクション (または必要に応じてインライン) に出力します。

{
    _id: facebook,
    value: 1,
    _id: twitter,
    value: 2
}

これは、JS である MongoDB コンソール言語で記述されています。MongoDB には、MR 関数を解析できる JavaScript パーサー (spidermonkey) が組み込まれています。Ruby から次のように関数をカプセル化します。

map = BSON::Code.new "function() { emit(this.filter, 1); }"

そして、次のように MR を実行します。

col.map_reduce(map, reduce,
        {
            :out => 'summary_collection',
            :raw => true
        }
      )

_id次に、文字列表現を として指定するか、単純find()にすべての結果を取得することによって、そのフィルターの要約コレクションを照会するだけです。

于 2012-10-25T11:53:36.080 に答える
0

フィルターは何でもよいと言う場合は、mapreduce を使用する必要があります。 http://www.mongodb.org/display/DOCS/MapReduce

これが動作するコードです。mongo コンソールに配置し、それを ruby​​ に変換します。

最初にマップ関数を作成します:

var map = function(){
  emit(this.filter, 1);
}

リデュース機能:

var reduce = function(key, value){
  var n = 0;
  value.forEach(function(v){
     n+=v;
  });
  return n;
};

古いバージョンのmongoを使用しているため、次のことを行う必要があります。

res = db.runCommand({
  'mapreduce' : 'YOURCOLLECTION',
  'map' : map,
  'reduce' : reduce,
  'out' : 'tmp'
});
db.tmp.find();

これはあなたを返します

{'_id' : 'facebook', 'value' : 1},
{'_id' : 'twitter', 'value' : 2}
于 2012-10-25T12:42:15.243 に答える