例如,我有一张桌子(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):
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个db查询。
我应该这样做:
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 :(得分:0)
由于数据库在搜索和分页方面很强大,我认为这些任务必须在数据库查询级别完成。将此类功能移至应用程序的尝试可能会导致从数据库中获取许多行到应用程序(所有页面而不是一个和所有搜索候选者而不是匹配)。
其他逻辑,尤其是更复杂的逻辑,并没有从数据库中受益。在应用程序级别拥有它通常允许更简单地编写和调试单元测试,同时还有用于数据库存储过程的测试框架。
在应用程序级实现时,最好在从应用程序的其余部分访问的某个层中实现所有逻辑,并且是调用数据库的唯一代码。