问题描述
我有两个猫鼬模型(User、Offert):
const offertSchema = new Schema(
{
...
likes: [{ type: mongoose.Schema.Types.ObjectId,ref: 'User' }],rejections: [{ type: mongoose.Schema.Types.ObjectId,}
);
...
const userSchema // typical: _id,email,etc - nothing fancy
您可能已经注意到,用户可以喜欢或拒绝优惠,然后他的 _id 被推送到优惠中的喜欢/拒绝数组。
用户向 BE (express,mongoose) 发送请求,我在哪里获取他的 id 和一些条件。一切正常,我得到了结果,但查询结果中的每个提议都包含喜欢和拒绝字段:
[
{ ...,rejections:[id1,id2,... idN],likes: [id1,...idZ] },{ ... }
]
我想用更有用的 FE 数据替换这些字段,例如一个布尔值,仅告知实际用户及其对报价的反应(如果有的话),所以它看起来像这样:
[
{ ...,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 }
}
]) ...
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)