nodejs の mongoose を調査しているときに、コレクション内のユーザーの量を知る必要があるという問題に遭遇しました。
私のコレクションにはレコードがあり、各レコードにはユーザーがいます。ユニーク (異なる) ユーザーの数を知りたい。
どうすればマングースでこれを行うことができますか?
編集:
データベースは非常に急速に成長しています。すべての個別のレコードを取得してカウントする代わりに、DB から数値を取得する方法はありますか?
nodejs の mongoose を調査しているときに、コレクション内のユーザーの量を知る必要があるという問題に遭遇しました。
私のコレクションにはレコードがあり、各レコードにはユーザーがいます。ユニーク (異なる) ユーザーの数を知りたい。
どうすればマングースでこれを行うことができますか?
編集:
データベースは非常に急速に成長しています。すべての個別のレコードを取得してカウントする代わりに、DB から数値を取得する方法はありますか?
ReddestのアプローチをMongoose 3.1.2で試したときに例外が発生したため、別の回答を次に示します(Reddestのアプローチは問題ないはずなので、これはMongooseのバグのようです)。
distinct
コレクションのユーザー識別フィールドの名前を指定して、コレクションのモデルでメソッドを呼び出すことができます。
Record.distinct('user_id').exec(function (err, user_ids) {
console.log('The number of unique users is: %d', user_ids.length);
});
distinct
または、検索から呼び出しを連鎖させたい場合は、呼び出しにコールバックを含めdistinct
ます(これは私にとってはうまくいきました):
Record.find().distinct('user_id', function (err, user_ids) { ... });
アップデート
値を取得せずにカウントだけが必要な場合count()
は、チェーンに呼び出しを追加します。
Record.distinct('user_id').count().exec(function (err, count) {
console.log('The number of unique users is: %d', count);
});
注: これは、最新の Mongoose コード (3.5.2) では機能しません。
集約はあなたのために働きます。そんな感じ:
Transaction.aggregate(
{ $match: { seller: user, status: 'completed' } },
{ $group: { _id: '$customer', count: {$sum: 1} } }
).exec()
クエリされたコレクションの数を取得したいだけの場合は、これを使用できます。
Record.find()
.distinct('user_id')
.count(function (err, count) {
//The number of unique users is 'count'
});
個別のクエリを実行できます。
var Record = db.model('Record', yourSchema);
Record.find().distinct('user').exec(callback);
Mongoose クエリ: http://mongoosejs.com/docs/queries.html
MongoDB 個別クエリ: http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct