Mongoose如何查询数组包含指定_id的文档?查询返回空如何解决?
问题根因
你当前写的查询语句likedPosts: ['222222222222']的语义是精确匹配整个likedPosts数组,只有当某个用户的likedPosts数组仅包含222222222222这一个元素、且元素顺序完全一致时才会命中,和你要查询「数组包含指定元素」的需求不符,因此返回空数组。
正确查询写法
1. 匹配数组包含单个指定元素
两种等价写法均可实现需求:
- 直接传目标值,MongoDB会自动匹配数组中包含该值的文档:
const usersWhoLikePost2 = UserModel.find({ likedPosts: '222222222222' });
- 使用
$in操作符,适合后续需要扩展匹配多个可选值的场景:
// 可匹配点赞了222222222222或者333333333333的用户 const usersWhoLikePosts = UserModel.find({ likedPosts: { $in: ['222222222222', '333333333333'] } });
2. 匹配数组同时包含多个指定元素
如果需要查询同时点赞了多个帖子的用户,使用$all操作符:
// 匹配同时点赞了222222222222和333333333333的用户 const usersWhoLikeBothPosts = UserModel.find({ likedPosts: { $all: ['222222222222', '333333333333'] } });
额外注意事项
如果你的likedPosts字段存储的是MongoDB原生ObjectId类型而非字符串,查询前需要先把目标值转换为ObjectId类型,否则类型不匹配也会查询为空:
const mongoose = require('mongoose'); const targetPostId = mongoose.Types.ObjectId('222222222222'); const usersWhoLikePost2 = UserModel.find({ likedPosts: targetPostId });
内容的提问来源于stack exchange,提问作者TJBlackman
相关产品推荐
相关产品推荐

