2017-01-07 4 views
1

私は10000万以上の文書を持つmongodbデータベースを持っています。私は集計をしたいので、私は文書に関する統計を与えることができます。 私の文書は次のようになります。巨大なデータセットのmongodb集約

{ 
    "categ": "categ_4", 
    "code": 200, 
    "date": "01/01/2017", 
    "host": "www.myhost.com", 
    "hour": "19", 
    "http_ver": "HTTP/1.1", 
    "idate": 20170101, 
    "length": 21, 
    "protocol": "https", 
    "remote_ip": "111.22.333.44", 
    "resp_time": 0, 
    "time": "19:53:15", 
    "url": "my_url", 
} 

集約するとき、私は私のシェルでこのようなクエリを実行します。

db.data.aggregate([{"$match": {"code":200}}, {"$group": {_id : "$code", total : {"$sum" : 1}}},{"$sort" : {_id: 1}}]) 

を問題は、それが計算するのに非常に長い時間がかかることです。これは遅すぎる。この操作をスピードアップする方法はありますか? 私は「コード」フィールドにしかし、誰の成功、私はより速く凝集を作るために何ができるか

db.data.createIndex({code:1}) 

でインデックスを作成するためにしようと試みましたか?

答えて

2

ありがとうあなたのクエリはあなたがそのための集約を必要としない

db.data.count({"code":200}) 

と同じであるように思えます。単純なカウント(インデックス付き)を試してください

+0

私のクエリは間違っていました( "$ match"の部分を削除しなければなりませんでした)。私が得たいものは次のようなものです: db.data.aggregate([{"$ group":{_id: "$ code"、合計:{"$ sum":1}}、{"$ 「合計」:56068} {"_id":410、 "sort":{total:1}})合計」:579872} { "_id":304、 "合計":8201025} { "_id":301、 "合計":1639247} { "_id":200、 "合計":82234244} ' –

+0

「単純なカウント(** with index **)」とはどういう意味ですか、mongodbにインデックスを追加する効率的な方法はありますか?上記のように、私はcreateIndex関数を試してみましたが、集計作業の仕方には影響しないようです。私はインデックスがmongodbとどのように動作するのか分かりません。 –

+0

@DanyM find/count/$ matchクエリでインデックスを使用できる場合は、コレクション内の各ドキュメントをスキャンする代わりにインデックスを使用します([Indexes manual](https://docs.mongodb.com/manual/indexes/)を参照してください) 。集計クエリが$ matchステップで開始されない場合、インデックスは使用されません。 –