
本文旨在指导开发者如何使用 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 中添加一个布尔字段来标识帖子类型,可以极大地简化查询原始帖子的过程。这种方法比使用复杂的聚合操作符更有效、更易于理解和维护。
注意事项
以上就是查找 Mongoose 集合中未被其他文档引用的文档的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号