3.13 Mongoose的复杂操作

Mongoose 内部设置表字段的嵌套

互相嵌套

// 对象嵌套
const postSchema = new Schema({
    name: String,
    // 在这里引用的User 定义type  为ObjectId  ref 为User
    postedBy: {type: mongoose.Schema.Types.ObjectId, ref: 'User'}, //这里和Model同名
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});
mongoose.model("Post",postSchema)
// 在User  中
// 数组嵌套
const UserSchema =new Schema({
    name:String,
    userID:String,
    posts:[{   // 在USer 中这样定义Post
        type: Schema.Types.ObjectId, ref: 'Post'  //这里和Model同名
    }]
})

互相关联对应

Mongoose 连表操作有两种模式

  1. 如果两表没有主表内部直接存储子表的字段 而是字段的外键模式,则使用aggregate

  2. 如果是子文档 例如存储在主文档的对象或者数组中则使用populate

Mongoose内的管道查询 aggregate

类似于mongoDB的管道查询,管道查询对应夺标查询,应用在两张表没有文档内引用但是有对应关系,schema 对应互相关联对应,例如我有两张表 user 和context 两张表 其中 user和context 是一对多关系。

mongoose 的其他管道查询参数类似于mongoDB

联表操作population

联表操作population对应 互相嵌套

以类别category和文章post之间的关联为例

category的model如下所示

post的model

在对类别的操作中, 都需要使用populate操作符显示出所包括的posts中的title

在对文章的操作中,则需要显示出类别category的number属性

在新增、更新和删除文章的操作中,都需要重建与category的关联

数组内部嵌套查询

数组内部的更新

数组内部的添加和删除

添加

删除

注意 :上面的逻辑对于一般性的操作还可以,可是对于严格操作数据就可能不会有一致性了

事物的支持

mongoDB 再4.0 后正式支持事物,mongoose 也开始支持事物了

其他例子请看官方示例arrow-up-right

对象内部的CRUD

对象内部的crud 使用 字段名.内部字段名的方式

Last updated