在我的应用程序中,我有一个User
集合。我的许多其他集合都有Author
(作者只包含user._id和user.name),例如我的Post
集合。因为我通常只需要显示_id和名称,例如我在UI上的帖子。
这很好,并且看起来是一个很好的方法,因为现在我每次处理帖子时都不必从数据库加载整个用户对象 - 我只能加载我的post.author.userId / post.author .NAME。
现在我的问题:用户更改了他或她的名字。显然,我的数据库中散布的所有Author
对象仍然有旧作者。
问题:
如果我要使用此解决方案,我将删除Author
模型,并且每次要显示当前用户的名称时都需要拨打用户数据库。
Author
,那么为user.name更改等情况实施解决方案的好方法是什么?我可以编写一个服务来检查每个具有当前user._id的作者的模型并且当然更新它们,但这听起来非常乏味。虽然我不确定是否有更好的解决方案。
答案 0 :(得分:1)
一种解决方案是在Author集合中仅保存id,使用Ref on User集合,并每次填充以从User集合中获取用户的名称。
var User = {
name: String,
//other fields
}
var Author = {
userId: {
type: String,
ref: "User"
}
}
另一种解决方案是在更新User集合中的名称时,更新作者集合中的所有名称。
我认为第一种解决方案会更好。
答案 1 :(得分:1)
是的,有时候数据库很适合以模块化方式录制。但你不应该为用户/作者分离收集,如
那时,如果您使用mongoose
作为驱动程序,则可以使用populate
来获取user
架构数据。
示例,我建模用户,作者,帖子。
var UserSchema = new mongoose.Schema({
type: { type: String, default: "user", enum: ["user", "author"], required: true },
name: { type: String },
// Author specific values
joinedAt: { type: Date }
});
var User = mongoose.model("User", UserSchema);
var PostSchema = new mongoose.Schema({
author: { type: mongoose.Scheam.Types.ObjectId, ref: "User" },
content: { type: String }
});
var Post = mongoose.model("Post", PostSchema);
在这种风格中,Post是分离的模型,必须像那样保存。如果您想查询包含作者姓名的帖子,您可以在populate
使用mongoose
。
Post.findOne().populate("author").exce(function(err, post) {
if(err)
// do error handling
if(post){
console.log(post.author.type) // author
}
});