2016-07-05 12 views
0

例えば、私は(MongoDBのを)テーブルを持っているデータベースクエリやアプリケーションロジックで作業する必要がありますか?

var schema = new mongoose.Schema({ 
    username: { type: String, unique: true, require: true }, 
    password: String, 

    role: { type: String, enum: ['admin', 'user'], default: 'USER' }, 
    ttt: {type: String, enum: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], } 
    deleted: { type: Boolean, default: false }, 
    disabled: { type: Boolean, default: false }, 

} 

それから私は、ユーザー(nodejs)のSTATを取得する必要があります:

var deletedUserCount = Users.count({deleted: true}) 
var disabledUserCount = Users.count({disabled: true}) 
var totalUserCount = Users.count({}) 
var adminUserCount = Users.count({role: 'admin'}) 
var userUserCount = Users.count({role: 'user'}) 

これは5デシベルクエリを起動します。

var users = Users.find({}, {role: 1, deleted: 1, disabled: 1}) 
var deletedUsers = _.filter(users, function(u) {return u.deleted;}) 
var deletedUserCount = deletedUsers.length; 

一つのDBクエリ:

私はこのような何かを行う必要があります。アプリケーションレベルで作業してください。

どちらの方がパフォーマンスが良いですか?

これは単純な例ですが、例が複雑な場合はどうなりますか?

どのようなルールに従うべきですか?

そして、私はcountByttt

tttACount = Users.count({ttt: 'A'}) 

答えて

0

を取得したいとデータベースが検索やページングに強いように、私は、これらのタスクは、データベースクエリ・レベルで行われなければならないと思います。このような機能をアプリケーションに移行しようとすると、データベースからアプリケーションに多くの行がフェッチされる可能性があります(マッチではなくすべての検索候補ではなくすべてのページ)。

他のロジック、特に複雑なロジックは、それほどデータベースに存在しないという利点はありません。アプリケーションレベルで実行すると、通常、ユニットテストの書き込みやデバッグがずっと簡単になりますが、データベースストアドプロシージャのテストフレームワークもあります。

アプリケーションレベルで実装する場合、アプリケーションの残りの部分からアクセスされる一部の層にすべてのロジックを実装し、データベースを呼び出す唯一のコードです。

+1

ここにはSQLはありません、btw。 –

関連する問題