往NoSQL数据库中存储模型很适合使用嵌套的文档。 例如:我们可以使用一个单独的集合(users)代替两个集合(posts和users),这个单独集合中的每一项都包含posts
决定是使用分开的集合还是嵌套的文档不止是一个代码结构的问题,这个问题的答案取决于用途。 例如:如果posts只是在users的上下文中用到,那么最好用嵌套的文档。 然而,如果博客里多个posts需要独立于他们的users上下文被查询,那么将集合分离会比较合适。
要使用嵌套文档,我们可以在Mongoose的原型中(例如:bookSchema或者postSchema)使用Schema.Types.Mixed这个类型,或者,我们可以为嵌套的文档创建一个新的原型。 前者的示例如下:
var userSchema = new mongoose.Schema({ name: String, posts: [mongoose.Schema.Types.Mixed] });//绑定方法、钩子等
var User = mongoose.model('User', userSchema);然而,后一种使用新的不同的子原型的方法更加灵活和强大:
var postSchema = new mongoose.Schema({ title: String, text: String });// post原型的其他方法、钩子等写在这里
var userSchema = new mongoose.Schema({ name: String, posts: [postSchema] });// user原型的其他方法、钩子等写在这里
var User = mongoose.model('User', userSchema);如果想把post嵌套进一个新建或已经存在的user文档中,可以将posts这个属性当作一个数组对象,然后使用JavaScript/Node.js API中的push方法,或者用MongoDB的$push操作符。 如下所示:我们可以通过ID(用户ID:_id)来查找一个user对象,然后给他增加一个post(newPost):
User.update( {_id: userId}, {$push: {posts: newPost}}, function (error, results){ //处理错误,检查结果 });