5月29日 01:08
Mongoose 子文档和引用怎么选?
子文档是嵌套在父文档中的 Schema,分单个子文档和子文档数组两种形式。子文档与父文档同生同灭、原子更新,适合总是一起访问且数量有限的数据。当数据需要独立查询、数量可能很大时,改用 ObjectId 引用。
追问
子文档的验证是何时触发的? 父文档保存时,子文档的验证会自动级联触发。如果子文档校验失败,整个保存操作回滚,无需手动调用子文档验证。
子文档怎么访问父文档? 通过子文档的 $parent 属性:comment.$parent 可拿到所属的 post 文档,便于在子文档方法中读取父级上下文。
向子文档数组添加元素有哪些方式? push/unshift 追加到数组,Mongoose 会自动标记数组为 modified。也可用 $push + $each 原子操作批量添加,避免先查再改的两步操作。
删除子文档用什么方法? pull 按条件删除:post.comments.pull({ author: 'Alice' });splice 按索引删除;也可用 $pull 原子操作。pull 更安全,不会因索引偏移误删。
子文档数组的单文档大小限制是什么? MongoDB 单文档上限 16MB,子文档数组过大不仅逼近限制,还导致查询和更新性能下降。经验值:数组元素超过几百条就该考虑拆分为独立集合。
写段代码
javascriptconst commentSchema = new Schema({ text: String, author: String }); const postSchema = new Schema({ title: String, comments: [commentSchema] }); // 添加 + 删除子文档 const post = await Post.findById(id); post.comments.push({ text: 'nice', author: 'Tom' }); post.comments.pull({ author: 'Tom' }); await post.save();