MongoDB 聚合 - 如何检查特定字段值是否存在于文档数组中
MongoDB Aggregate - How to check if a specific field value exists in array of documents
我有这个 LikeSchema
用于 Posts
,我想要实现的是检查用户 id
是否存在于 Likes Document 的 _user_id
[=24 数组中=]
假设我有这个 Likes
文档数组
[
{
id: 'a',
_user_id: 'u1',
_post_id: 'p1'
},
{
id: 'b',
_user_id: 'u2',
_post_id: 'p1'
}
]
如何使用聚合检查 likes 数组文档中是否存在用户 ID u1
?
我有这个 Like 架构
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
}
}
}
])
我有这个 LikeSchema
用于 Posts
,我想要实现的是检查用户 id
是否存在于 Likes Document 的 _user_id
[=24 数组中=]
假设我有这个 Likes
文档数组
[
{
id: 'a',
_user_id: 'u1',
_post_id: 'p1'
},
{
id: 'b',
_user_id: 'u2',
_post_id: 'p1'
}
]
如何使用聚合检查 likes 数组文档中是否存在用户 ID u1
?
我有这个 Like 架构
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
}
}
}
])