2016-10-15 16 views
0

mongo(バージョン2.4と3.2)コレクションのドキュメント数を実行しています。コレクションは非常に大きく、3821085文書です。私は参照番号_idですべての文書を数える必要があります。このクエリは非常に長い時間がかかるmongodbカウントとカウントで検索

db.SampleCollection.find({"field._id" : ObjectId("UUID")}).count() db.SampleCollection.count({"field._id" : ObjectId("UUID")})

:私は2つの異なるクエリを試してみました。私はそれを完了させていない多くの時間、5分以上と私は怖がってそれを殺す。

このコレクションについては、field._idはインデックスではありません。このクエリでインデックスを使用する関連情報はありません。

mongoのドキュメントを数えるのに適していますか?

UPDATE

私は、フィールドfield._idにインデックスが必要であることを理解しています。フィールドのインデックスを持っていれば、大きなコレクションでより良いパフォーマンスを得ることができますdb.SampleCollection.find(...).count()またはdb.SampleCollection.count(...)?または、2つの間に違いはありませんか?

+2

あなたはこれらのクエリの両方がフルコレクションのスキャンを行う必要があり、取るために起こっていることを意味し、「field._idx」にインデックスを持っていない場合しばらく。 –

+0

@soundslikeodd私は答えを更新しました。 –

答えて

3

ご使用のシナリオでは、インデックスが必要です。

インデックスは、MongoDBでのクエリの効率的な実行をサポートします。インデックスがなければ、MongoDBはコレクションのスキャンを実行する必要があります。つまり、コレクション内のすべてのドキュメントをスキャンして、クエリ文に一致するドキュメントを選択する必要があります。

https://docs.mongodb.com/manual/indexes/

UPDATE:

今尋ねた質問は異なっています。 "collection.find({})。count()"はもっと速く、 "collection.count()"ですか? MongoDBのドキュメントによると

数は()db.collection.find(クエリ).count()構文と同等です。 https://docs.mongodb.com/manual/reference/method/db.collection.count/

+0

というのは、インデックスを持たずにカウントを行いたい場合は、クエリを_idフィールドに減らす必要があるということです。 – dtc

+0

コレクション内の雇用者数を数えたい場合は、 ".find()。count()"を使って各文書がEmployerであり、インデックスが不要であると仮定すると、かなり簡単です。しかし、「31歳以上の雇用者数」をカウントしたい場合は、「年齢」フィールドにフルコレクションスキャンを避けるためのインデックスが必要です。 –

0

あなたはこのようなfield._idにインデックスを追加する必要があります

db.SampleCollection.createIndex({ "field._id": 1 }); 

を次に、その場で文書を数える/見つけようとしてすべてのクエリは、このインデックスを使用し、より高速に実行されます。たとえば、次のように

db.SampleCollection.count({"field._id" : ObjectId("UUID")}); 

を参照してください - https://docs.mongodb.com/manual/core/index-single/MongoDB 'count()' is very slow. How do we refine/work around with it?

関連する問題