如何在MongoDB中查询存在符合条件评论的帖子?
解决方法:查询包含指定评论的帖子
你的现有代码里,$lookup的pipeline写法有问题——直接写{"content": /foo/}是无效的,必须用$match阶段来过滤评论内容。在此基础上,还需要添加一个筛选步骤,只保留关联后评论数组不为空的帖子。
方法一:聚合管道关联+筛选
完整代码如下:
db.collection('post').aggregate([ { $lookup: { from: 'comment', localField: '_id', foreignField: 'post', as: 'comments', pipeline: [ { $match: { content: /foo/ // 等同于{$regex: "foo"},支持正则匹配 } } ] } }, { $match: { $expr: { $gt: [ { $size: "$comments" }, 0 ] } } } // 可选:如果不需要返回comments字段,可添加$project精简结果 // { // $project: { title: 1, description: 1 } // } ])
步骤说明:
$lookup阶段:关联comment集合,同时通过内部pipeline的$match,只把内容包含"foo"的评论关联到对应的帖子上,结果存在comments数组中。$match阶段:通过$size计算comments数组的长度,筛选出长度大于0的帖子——也就是至少有一条符合条件评论的帖子。
方法二:先提取有效postId再查询
如果你的comment集合数据量较大,这种方式性能更优:
// 第一步:获取所有包含"foo"评论对应的postId const targetPostIds = await db.collection('comment').distinct('post', { content: /foo/ }); // 第二步:根据postId查询对应的帖子 const matchedPosts = await db.collection('post').find({ _id: { $in: targetPostIds } }).toArray();
这种方式先从comment集合中提取符合条件的postId列表,再直接查询post集合,避免了聚合关联的开销,若comment集合有content和post字段的联合索引,效率会更高。
内容的提问来源于stack exchange,提问作者Wilson
相关产品推荐
相关产品推荐

