
本文旨在指导开发者如何使用 Mongoose 查询数据库,找出 `Post` 集合中所有未被其他文档的 `replies` 数组引用的文档,即查找所有非回复的原始帖子。文章将介绍一种通过修改 Schema 结构,添加一个布尔字段来标识帖子是否为回复的方法,从而简化查询过程。
在处理具有自引用关系的 Mongoose Schema 时,例如一个 Post Schema 包含一个 replies 数组,该数组引用了其他 Post 文档,我们可能需要查找所有未被引用的文档,即所有原始帖子。虽然可以使用 $lookup 和 $nin 等聚合操作符来实现,但更有效且更易于维护的方法是修改 Schema 结构。
修改 Schema 以跟踪帖子类型
最佳实践是在 Post Schema 中添加一个布尔字段,用于明确标识帖子是否为原始帖子或回复。例如,可以添加一个名为 isOriginalPost 的字段。
const mongoose = require('mongoose');const schema = new mongoose.Schema({ creator: { type: mongoose.Schema.Types.ObjectId, ref: 'User', validate: [mongoose.Types.ObjectId.isValid, 'Creator ID is invalid'] }, owner: { type: mongoose.Schema.Types.ObjectId, ref: 'User', validate: [mongoose.Types.ObjectId.isValid, 'Owner ID is invalid'] }, content: { type: String, required: 'Content is required' }, likes: [ { type: mongoose.Schema.Types.ObjectId, ref: 'Like', validate: [mongoose.Types.ObjectId.isValid, 'Like ID is invalid'] } ], replies: [ { type: mongoose.Schema.Types.ObjectId, ref: 'Post' } ], isOriginalPost: { // 新增字段 type: Boolean, default: true // 默认为 true,表示原始帖子 }}, { autoCreate: true, timestamps: true});const Post = mongoose.model('Post', schema);module.exports = Post;
在这个修改后的 Schema 中,isOriginalPost 字段的默认值为 true,这意味着默认情况下,所有新创建的帖子都被视为原始帖子。当创建一个回复帖子时,需要将 isOriginalPost 设置为 false。
创建回复帖子
在创建回复帖子时,需要确保将 isOriginalPost 字段设置为 false,并且将该回复帖子的 ObjectId 添加到原始帖子的 replies 数组中。
async function createReplyPost(originalPostId, content, creator, owner) { const replyPost = new Post({ creator: creator, owner: owner, content: content, isOriginalPost: false // 设置为 false }); await replyPost.save(); // 将回复帖子的 ID 添加到原始帖子的 replies 数组中 const originalPost = await Post.findByIdAndUpdate(originalPostId, { $push: { replies: replyPost._id } }); if (!originalPost) { throw new Error('Original post not found'); } return replyPost;}
查询原始帖子
现在,要查找所有原始帖子,只需查询 isOriginalPost 字段为 true 的文档即可。
async function getOriginalPosts() { const originalPosts = await Post.find({ isOriginalPost: true }); return originalPosts;}
总结
通过在 Schema 中添加一个布尔字段来标识帖子类型,可以极大地简化查询原始帖子的过程。这种方法比使用复杂的聚合操作符更有效、更易于理解和维护。
注意事项
在现有数据库中添加 isOriginalPost 字段后,需要更新现有文档以设置该字段的正确值。确保在创建回复帖子时,始终将 isOriginalPost 设置为 false。这种方法适用于需要频繁查询特定类型文档的场景。
以上就是查找 Mongoose 集合中未被其他文档引用的文档的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1529392.html
微信扫一扫
支付宝扫一扫