首页 > 解决方案 > 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 } 
                    }
                ]) ...

标签: mongodbmongoosedatabase-schema

解决方案


推荐阅读