在Mongoose中引用文档的简便方法

时间:2015-07-30 07:30:53

标签: node.js mongodb mongoose

在我的应用程序中,我有一个User集合。我的许多其他集合都有Author(作者只包含user._id和user.name),例如我的Post集合。因为我通常只需要显示_id和名称,例如我在UI上的帖子。

这很好,并且看起来是一个很好的方法,因为现在我每次处理帖子时都不必从数据库加载整个用户对象 - 我只能加载我的post.author.userId / post.author .NAME。

现在我的问题:用户更改了他或她的名字。显然,我的数据库中散布的所有Author对象仍然有旧作者。

问题:

  1. 是我的approuch固定,还是我应该只在我需要的地方引用userId?
  2. 如果我要使用此解决方案,我将删除Author模型,并且每次要显示当前用户的名称时都需要拨打用户数据库。

    1. 如果我按原样离开Author,那么为user.name更改等情况实施解决方案的好方法是什么?
    2. 我可以编写一个服务来检查每个具有当前user._id的作者的模型并且当然更新它们,但这听起来非常乏味。虽然我不确定是否有更好的解决方案。

      1. 我将来如何处理这类问题?

2 个答案:

答案 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 
  }
});