私はいくつかの記事と例を調べましたが、MongoDB でこの SQL クエリを実行する効率的な方法をまだ見つけていません (数百万の行ドキュメント)
最初の試み
(たとえば、このほぼ重複した質問から - SQLの SELECT DISTINCT? に相当するMongo)
db.myCollection.distinct("myIndexedNonUniqueField").length
データセットが巨大であるため、明らかにこのエラーが発生しました
Thu Aug 02 12:55:24 uncaught exception: distinct failed: {
"errmsg" : "exception: distinct too big, 16mb cap",
"code" : 10044,
"ok" : 0
}
2 回目の試行
グループを作ってみることにしました
db.myCollection.group({key: {myIndexedNonUniqueField: 1},
initial: {count: 0},
reduce: function (obj, prev) { prev.count++;} } );
しかし、代わりに次のエラー メッセージが表示されました。
exception: group() can't handle more than 20000 unique keys
3 回目の試行
まだ試していませんが、関連するいくつかの提案がありますmapReduce
例えば
- これは、mongodbで個別にグループ化する方法ですか? (受け入れられません、回答者/ OPはそれをテストしませんでした)
- 機能別のこの 1 つのMongoDB グループ(Second Attempt に似ているようです)
- これはhttp://blog.emmettshear.com/post/2010/02/12/Counting-Uniques-With-MongoDB
- これhttps://groups.google.com/forum/?fromgroups#!topic/mongodb-user/trDn3jJjqtE
- これはhttp://cookbook.mongodb.org/patterns/unique_items_map_reduce/
また
.distinct
カウントのみを返す必要があることを言及するメソッドを修正する GitHub にプル リクエストがあるようですが、まだ開いています: https://github.com/mongodb/mongo/pull/34
しかし、この時点で、ここで質問する価値があると思いました。この件に関する最新情報は何ですか? 個別のカウントのために、SQL または別の NoSQL DB に移動する必要がありますか? または効率的な方法はありますか?
アップデート:
MongoDB の公式ドキュメントに関するこのコメントは心強いものではありませんが、これは正確ですか?
http://www.mongodb.org/display/DOCS/Aggregation#comment-430445808
アップデート2:
新しい Aggregation Framework が上記のコメントに答えているようです... (MongoDB 2.1/2.2 以降、開発プレビューが利用可能、本番用ではありません)