如何在Mongoose中对数组执行CRUD及理解Schema工作机制
Mongoose Schema在MongoDB中的工作原理
- 你定义的
blogPostSchema是Mongoose对MongoDB文档结构的约束与映射,编译成Model(如const BlogPost = mongoose.model('BlogPost', blogPostSchema))后,就是和MongoDB对应集合(Mongoose默认将Model名转为小写复数形式,即blogposts集合)交互的入口。 - 对于
tags: [String]字段,Mongoose会强制存入的数组元素为字符串类型,做前端数据校验和类型转换;而MongoDB本身是无Schema的文档数据库,Mongoose的Schema相当于给你提供了结构化操作的一层封装,既保留MongoDB的灵活性,又保证数据格式的一致性。
Create(添加标签)
- 新建文档时直接传入tags数组:
const newPost = new BlogPost({ title: 'MongoDB入门', tags: ['数据库', 'MongoDB'] }); await newPost.save();
- 给已有文档添加单个标签:
await BlogPost.updateOne( { title: 'MongoDB入门' }, { $push: { tags: 'Mongoose' } } );
- 批量添加不重复标签(自动跳过已存在的标签):
await BlogPost.updateOne( { title: 'MongoDB入门' }, { $addToSet: { tags: { $each: ['NoSQL', '数据库'] } } } );
Read(查询标签相关文档)
- 查询包含指定标签的所有文档:
const postsWithMongo = await BlogPost.find({ tags: 'MongoDB' });
- 查询同时包含多个指定标签的文档:
const posts = await BlogPost.find({ tags: { $all: ['MongoDB', 'Mongoose'] } });
- 获取单篇文档的tags数组:
const post = await BlogPost.findOne({ title: 'MongoDB入门' }); console.log(post.tags); // 输出该文档的标签数组
Update(编辑标签)
- 修改数组中匹配到的第一个指定标签:
await BlogPost.updateOne( { title: 'MongoDB入门', tags: '数据库' }, { $set: { 'tags.$': '关系型数据库' } } ); // 这里的`$`是占位符,对应数组中第一个符合查询条件的元素
- 直接替换整个tags数组:
await BlogPost.updateOne( { title: 'MongoDB入门' }, { $set: { tags: ['NoSQL', 'Mongoose', '数据库'] } } );
Delete(删除标签)
- 删除数组中指定的单个标签:
await BlogPost.updateOne( { title: 'MongoDB入门' }, { $pull: { tags: 'Mongoose' } } );
- 批量删除数组中多个指定标签:
await BlogPost.updateOne( { title: 'MongoDB入门' }, { $pull: { tags: { $in: ['数据库', 'NoSQL'] } } } );
- 清空整个tags数组:
await BlogPost.updateOne( { title: 'MongoDB入门' }, { $set: { tags: [] } } );
内容的提问来源于stack exchange,提问作者Ajay Kumar
相关产品推荐
相关产品推荐

