mongodb - Mongoose - 用基于外部参数的布尔值替换引用数组
问题描述
我有两个猫鼬模型(用户,报价):
const offertSchema = new Schema(
{
...
likes: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
rejections: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
}
);
...
const userSchema // typical: _id, email,etc - nothing fancy
你可能已经注意到用户可以喜欢或拒绝一个提议,然后他的 _id 被推送到提议中的喜欢/拒绝数组。
用户向 BE (express, mongoose) 发送请求,我在哪里得到他的 id 和一些条件。一切正常,我得到了结果,但是查询结果中的每个 offert 都包含喜欢和拒绝字段:
[
{ ..., rejections:[id1,id2, ... idN], likes: [id1,id2,...idZ] } ,
{ ... }
]
我想用更有用的 FE 数据替换这些字段,例如布尔值,仅告知实际用户和他对 offert 的反应(如果有的话),所以它看起来像这样:
[
{ ..., rejections:true/false, likes:true/false } ,
{ ... }
]
我相信我可以在整个查询结果上创建 .forEach 并使用以下内容覆盖每个文档上的这两个值:
const userId = 'xxx';
el => ({...el, rejections: el.rejections.includes(userId), likes: ... });
但它看起来很丑。而且可能不是我能做的最好的。
我更愿意找一些 mongoose/mongodb 的特性来配合。我一直在考虑虚拟,但看起来我不能在那里传递外部参数,我相信它会创建一个额外的字段而不是覆盖原来的字段。
也许是一个静态方法,但我仍然不知道在哪里使用它 - 在查询看起来与上面的第一个解决方案几乎相同之后 - 我可以以某种方式将它放入查询中吗?
那么在查询时还有其他“正确”的方法吗?
我想这个问题可以总结为:在执行这个查询时,是否可以用基于该字段值和外部参数的新值覆盖每个文档(查询结果)的字段值?
我确实发现了类似的东西 - 如果我从查找切换到聚合。不完全是我想要的,但现在似乎很好:
const offerts = await Offert.aggregate([
{$match: query},
{$addFields: {
liked: { $in: [user._id, "$likes"]},
rejected: { $in: [user._id, "$rejections"]},
}},
{
$project: { likes: 0, rejections:0 }
}
]) ...
解决方案
推荐阅读
- python - 尝试将特定文件夹复制到另一个位置:主文件夹名称更改但子文件夹名称保持不变
- c++ - System Verilog DPI - 在 cpp 中运行并行线程,在 SV 中运行其他线程
- express - express 中的多个“res”语句会导致问题吗?
- r - 如何在 rvest 中跟踪具有特定 id 的元素的链接?
- database - 一个孩子可以属于不同父母的父子关系:设计方法
- c# - 如何为自托管应用程序启用 TLS1.2 的安全协议?
- android - Django request.body 数据不完整
- javascript - Javascript“加载”事件未按预期工作
- python - 在 Python 中,如何找到字符串中表达式之后的子字符串?
- python-3.x - 将 NaN 文本列分隔到其他数据框中