往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){
//处理错误,检查结果
});