0

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

{"users" : ["u1", "u2", "u3"]}
{"users" : ["u1", "u4"]}
{"users" : ["u1", "u3", "u5", "u6", "u7"]}

ユーザー数の多いドキュメントの数を取得したいのですが。上記を使用すると、クエリはデータベース内の最大ユーザー数として5を返します。MongoDBでこれを行うにはどうすればよいですか?

特定のサイズのドキュメントの数を取得するには、次のコマンドを使用します。

db.mydb.find({users: {$size: 5}}).count()

ただし、ユーザー配列内のすべてのドキュメント内で最大数を見つける方法がわかりません。

ありがとう。

4

2 に答える 2

2

これをMongoDBで直接行うことはできません。ただし、同じドキュメントに「user_count」という追加のフィールドを追加し、「users」配列に新しいユーザーを追加するたびに$inc演算子を使用して1つずつインクリメントすることができます。

更新は次のようになります。

db.mydb.update({<update_condition>}, {$push :{"users":"u8"}, $inc : {"user_count":1}})
于 2012-06-07T02:30:31.147 に答える
0

以下はMongoDBの3つの実用的なソリューションですが、エンジニアリングのニーズによっては、Asyaの回答の方が適切な場合があります。次のような質問に答える必要があります。私のコレクションの大きさ、および各ソリューションのコスト/効率はどれくらいですか。他にパフォーマンスの問題はありますか?問題の領域で簿記をすることで、これをより効率的に解決できますか?

これが一般的な質問である場合は、アプリケーションを介して最大カウントを明示的に追跡することを検討する必要があります。ユーザーを増やすには、最大数を追跡するだけです。ただし、(のみ)現在の最大値からドキュメントが減少した場合は、完全なクエリのコストを支払う必要があります。Asyaのソリューションは、この完全なクエリに役立つ可能性があります。

これがMongoDBの可能性です。問題とパフォーマンスまたはエンジニアリングへの影響に関して、ドキュメントを注意深く調べてください。

  1. db.evalサーバーサイズのコード実行-http ://www.mongodb.org/display/DOCS/Server-side+Code+Execution

    注意:長時間実行されるジョブには、db.eval()の代わりにmap/reduceを使用してください。db.evalは他の操作をブロックします!

  2. アグリゲーション「グループ」-http ://www.mongodb.org/display/DOCS/Aggregation

  3. MapReduce- http://www.mongodb.org/display/DOCS/MapReduce

count_query.js

db.mydb.drop();
db.mydb.save({"users" : ["u1", "u2", "u3"]});
db.mydb.save({"users" : ["u1", "u4"]});
db.mydb.save({"users" : ["u1", "u3", "u5", "u6", "u7"]});
//printjson(db.mydb.find().toArray());

printjson(db.eval(function() {
    var count = 0;
    db.mydb.find().forEach( function(doc) {
        if (doc.users.length > count)
            count = doc.users.length;
    });
    return count;
}));

printjson(db.mydb.group({
    reduce: function(doc, prev) {
        if (doc.users.length > prev.count)
            prev.count = doc.users.length;
    },
    initial: {count: 0}
})[0].count);

printjson(db.mydb.mapReduce(
    function() { emit(0, {count: this.users.length}); },
    function(key, values) {
        var result = {count: 0};
        values.forEach(function(value) {
            if (value.count > result.count)
                result.count = value.count;
        });
        return result;
    },
    {out: {inline: 1}}  
).results[0].value.count);

実行と出力

$ mongo count_query.js
MongoDB shell version: 2.0.4
connecting to: test
5
5
5
于 2012-06-08T04:54:13.063 に答える