Mongoose - 根据外部参数用布尔值替换 refs 数组

问题描述

我有两个猫鼬模型(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 (将#修改为@)