我目前正在为一家小公司工作,我正在研究用户架构,如下所示:
var UserSchema = new Schema({
name: String,
email: {
type: String,
unique: true
},
username: {
type: String,
unique: true
},
hashed_password: String,
provider: String,
salt: String,
由于我正在处理的应用程序的更改,我更新了此架构:
var UserSchema = new Schema({
name: String,
email: {
type: String,
unique: true
},
username: {
type: String,
unique: true
},
hashed_password: String,
provider: String,
salt: String,
stats : {
bricks: Number,// Number of bricks created by an user
layers: Number,// --------- layers ------------------
projects: Number,//-------- projects ----------------
lastogin: Date
},
});
当然,在线有一个以前版本的应用程序,我需要更新用户集合中现有的所有用户。
为此,我需要计算每个用户创建的每个砖块/图层/项目。这是砖架构:
/**************
App fields
**************/
// False deletion field
field.deleted = function() {
return field.bool();
};
// Creation date
field.created = function() {
return field.date();
};
// Title Field
field.title = function() {
return field.string();
};
// Desc Field
field.desc = function() {
return field.string();
};
// Default short Id field
field.shortId = function(id) {
return {
type: ShortId,
index: true,
len: 7, // Length 7 characters
base: 64, // Web-safe base 64 encoded string
alphabet: "abcdefghijklmnopkrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", // Use default alphabet for base
retries: 4 // Four retries on collision
};
};
// The author of the content
field.user = function() {
return {
user: field.ref('User'),
}
};
field.favorites = function() {
return [{
type: Schema.ObjectId,
ref: 'User'
}];
};
field.contributors = function() {
return [{
type: Schema.ObjectId,
ref: 'User'
}];
};
field.comments = function() {
return [{
// user that have written the comment
user: field.ref('User'),
// comment text it-self
comment: field.string()
}];
};
经过一番研究后,我决定使用mongoose(和mongodb)的聚合管道来对用户进行分组,使用以下查询:
db.bricks.aggregate(
[
{
$group : {
_id : "$user",
count : { $sum : 1}
}
]
)
以及 mongoose 的以下方法:
var promise =Brick.aggregate()
.group({ _id: "$user"})
.exec(function (err, res) {
if (err) return handleError(err);
else {
console.log(res);
}
});
我知道exec()方法返回promise,我仍然在学习如何正确使用它。
之后我想对所有用户执行更新查询。由于他们没有创建相同数量的砖块,我无法进行多次更新,我需要使用查询循环查看结果,如下所示:
User.update({id : user_id}, {$set : {"stats.bricks" : Brick.find({user : user_id}).count()}})
是否可以这样做或者我需要以不同的方式重新思考问题
答案 0 :(得分:0)
我尝试了别的东西并成功获得了我想要的结果
exports.updatesUsersStats = function (req, res) {
User.find().exec(function(err, users) {
console.log(users.length);
_.each(users, function(currentUser) {
console.log("Count bricks user :" +currentUser._id);
Brick.find({user : currentUser._id})
.exec(function(err, bricks) {
if(err) return handleError(err);
console.log("Update user :"+ currentUser._id);
User.update({_id : currentUser._id}, {$set : {"stats.bricks" : bricks.length}})
.exec(function(err)
{
if(err) return handleError(err);
});
});
});
res.jsonp({
updateType : "updateUserStats",
operations : users.length
});
});
};
我放弃了考虑所有用户(谁没有创建内容)的聚合。