【发布时间】:2020-10-28 01:05:52
【问题描述】:
所以我遇到的问题是我只想喜欢用户评论一次,目前我正在使用 addToSet 运算符,因为根据定义,如果该值已经存在,它不会增加值。
但在我的情况下它会添加,可能是因为我添加的是对象而不是值,并且当我添加 mongo 时会生成 _id?
这是我的事件模型:
creator: {
type: Schema.Types.ObjectId,
ref: 'User'
},
comments: [
{
user: {
type: Schema.Types.ObjectId,
ref: 'User'
},
text: {
type: String,
required: true
},
likes: [
{
user: {
type: Schema.Types.ObjectId,
ref: 'User'
}
}
]
}
]
}
这是我的 addLike 函数:
commentLike: async (req, res) => {
console.log('working', req.params.id, req.params.idas, req.params.commentID);
Events.findOneAndUpdate(
{ _id: req.params.idas, comments: { $elemMatch: { _id: req.params.commentID } } },
{ $addToSet: { 'comments.$.likes': { user: req.params.id } } },
(result) => {
res.json(result);
}
);
}
当我添加喜欢时,我的喜欢数组看起来像这样:
"likes" : [
{
"user" : ObjectId("5b53442c1f09f525441dac31"),
"_id" : ObjectId("5b54a5263e65324504035eac")
},
{
"user" : ObjectId("5b4b4725a3a5583ba8f8d513"),
"_id" : ObjectId("5b54a5bb3e65324504035eb0")
},
]
【问题讨论】:
-
它不起作用,因为
$addToSet将整个对象放在一个上下文中,而在这里你只添加了user...所以这里你的一个元素是{ "user" : ObjectId("5b53442c1f09f525441dac31"), "_id" : ObjectId("5b54a5263e65324504035eac") }现在它会添加如果user相同但_id不同,但如果user和_id相同,则不会添加.. -
我明白了,有没有其他方法可以让用户添加到数组中,即使 _id 会有所不同?
-
最好将
likes设为用户 ObjectIds 数组而不是对象。这将减少文档大小并允许$addToSet按您的意愿工作。