javascript - 如果存在与 MongoDB 和 Mongoose 匹配的另一个文档,则添加字段
问题描述
我的数据库中有一组包含基本信息的帖子,例如:
Posts = {
_id: '',
title '',
desc '',
...
}
我也有一个喜欢的集合,比如(创建或删除用户喜欢的文件):
Likes = {
_id: '',
user_id: '',
post_id: '',
}
目标是,当我获得Posts列表时,添加一个字段Liked ,如果文档Like匹配,则显示 true/false ,以及Like集合中的匹配数(我知道如何)喜欢:
Posts = [{
_id: '',
title '',
desc '',
liked: true,
likes: 5,
...
}, ...]
我用过$lookup
&$addFields
但到目前为止只能加入一个值。在我的情况下,我想要一个特定的文档并按 2 个字段(user_id、post_id)过滤。
到目前为止我得到了什么:
const posts = await posts.aggregate
([
{
$lookup: {
from: 'likes',
localField: '_id',
foreignField: 'post_id',
as: 'likes'
}
},
{ $match: {
user_id: mongoose.Types.ObjectId(req.params.id),
} },
{
$addFields: {
likes:
{ $size: "$likes" } // here nb of likes
}
}
])
解决方案
试试这个
db.getCollection('post').aggregate([
{
$lookup: {
from: 'likes',
localField: '_id',
foreignField: 'post_id',
as: 'likes'
}
},
{
$addFields:{
size:{$size:"$likes"},
liked:
{$size: {
$filter: {
input: "$likes",
as: "item",
cond: { $eq: [ "$$item.user_id", ObjectId("5f2a38ad61a591cf96d58f6a") ] }
}
}
}
}
},
{
$addFields:{
liked:{
$cond:[{$eq:["$liked",0]},false,true]
}
}
}
])
推荐阅读
- android - CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera) 已过时
- python - 不确定 asyncio 的工作原理以及我如何从持续运行的异步文件夹看门狗函数返回信息
- azure-devops - Azure Devops:chromedriver 不是有效的 Win32 应用程序
- firebase - 使用带有 Flutter Web App 的 http 包发布到 Cloud Firestore 及其 REST API
- c++ - 无法执行它给出错误的 else 语句
- javascript - nuxtjs Fontawesome 一些图标无法显示
- css - 使用 :is() 的 CSS 选择器有什么无效的
- c++ - Box2D 碰撞问题
- javascript - 无法解析“../SecondApp\node_modules\react-navigation-stack\lib\module\navigators”中的“react-navigation”
- entity-framework - Dbcontext 处理异常 EF core 3.1