我有这个用于 Posts
的 LikeSchema
,我想要实现的是检查用户 id
是否存在于这些 Likes Document 数组中 _user_id
假设我有这个Likes
文档数组
[
{
id: 'a',
_user_id: 'u1',
_post_id: 'p1'
},
{
id: 'b',
_user_id: 'u2',
_post_id: 'p1'
}
]
如何使用聚合检查用户 ID u1
是否存在于 Likes 数组文档中?
我有这个喜欢架构
const LikeSchema = new Schema({
_post_id: {
type: Schema.Types.ObjectId,
ref: 'Post',
required: true
},
_user_id: {
type: Schema.Types.ObjectId,
ref: 'User',
required: true
},
})
还有我的聚合
const result = await Post.aggregate([
{
$match: { privacy: 'public' }
},
{
$lookup: {
from: 'likes',
localField: '_id',
foreignField: '_post_id',
as: 'likes'
}
},
{
$addFields: {
isLiked: {
$in: [req.user._id, '$likes'] // WONT WORK SINCE I STILL HAVE TO MAP AS ARRAY OF _user_id
}
}
}
])
我想到的解决方案是首先将数组映射为仅包含用户 ID 值,然后执行 $in
表达式。
如何在聚合阶段从 lookup
映射 likes
数组,以便它仅包含用户 id 值数组来生成 $in
表达式匹配?或者也许有更好的方法来检查对象数组中存在的值?
最佳答案
终于找到答案了。
事实证明,聚合中存在一个 $map
运算符。我就是这样使用的
const result = await Post.aggregate([
{
$match: { privacy: 'public' }
},
{
$lookup: {
from: 'likes',
localField: '_id',
foreignField: '_post_id',
as: 'likes'
}
},
{
$addFields: {
likeIDs: { // map out array of like id's
$map: {
input: "$likes",
as: "postLike",
in: '$$postLike._id'
}
}
}
},
{
$addFields: {
isLiked: {
$in: [req.user._id, '$likeIDs'] // it works now
}
}
}
])
关于MongoDB 聚合 - 如何检查文档数组中是否存在特定字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66705264/