我正在与nodejs和mongodb一起实现“类似”功能。
基本上,模型用户有一个属性数组,在其中存储了喜欢的文档的所有ID。
然后我在该数组中查找是否包含喜欢的文档,我将其放在喜欢的位置并将ID从数组中取出,如果不包含ID,则添加一个“喜欢”并将其推入数组。
基本上,我提出了两种解决方案:
在这里,我正在使用JavaScript编写id数组的逻辑。
User.findOne(query)
.then(user => {
let add = 0;
let likedShirts = user.likedShirts
if (!likedShirts.includes(shirtId)) {
add = 1
likedShirts.push(shirtId)
} else {
add = -1
let index = likedShirts.indexOf(shirtId)
likedShirts.splice(index, 1)
}
Shirt.findByIdAndUpdate(shirtId, { $inc: { likes: add } }, { new: true, runValidators: true }, (err, result) => {
if (err) {
res
.status(500)
.json({ message: err.message })
return;
}
user.likedShirts = likedShirts
user.save()
res
.status(200)
.json({ likes: result.likes, shirtId: shirtId })
})
})
.catch(err => {
res
.status(500)
.json({ message: err.message })
return;
})
在这里,我使用的是纯mongo,但首先要找到一个用户,然后是衬衫,然后再是用户。我以某种方式发现它很丑陋,但我总是尝试使用尽可能少的javascript。
User.findOne(query)
.then(user => {
if (!user.likedShirts.includes(shirtId)) {
Shirt.findByIdAndUpdate(shirtId, { $inc: { likes: 1 } }, { new: true, runValidators: true }, (err, result) => {
User.findOneAndUpdate(query, { $push: { likedShirts: shirtId } }).then(() => {
if (err) {
res
.status(500)
.json({ message: err.message })
}
res
.status(200)
.json({ likes: result.likes, shirtId: shirtId })
})
.catch(err => {
res
.status(500)
.json({ message: err.message })
})
})
} else {
Shirt.findByIdAndUpdate(shirtId, { $inc: { likes: -1 } }, { new: true, runValidators: true }, (err, result) => {
User.findOneAndUpdate(query, { $pull: { likedShirts: shirtId } }).then(() => {
if (err) {
res
.status(500)
.json({ message: err.message })
}
res
.status(200)
.json({ likes: result.likes, shirtId: shirtId })
})
.catch(err => {
res
.status(500)
.json({ message: err.message })
})
})
}
})
.catch(err => {
res
.status(500)
.json({ message: err.message })
})
基本上,我想知道的是什么,最好的选择是什么?如果我对数据库进行更多咨询(如第二个示例),也可以,或者最好使用javascript。 我尝试测量时间,基本上是相同的,但是我使用的用户和数据很少。有规则吗?最佳做法?