这个问题与here所公开的相同问题有关(已向该问题添加了一个解决方案),但我重新设计了我的算法,并提出了一个完全不同的问题。
这是怎么回事?
const mongoose = require('mongoose');
const sauceSchema = mongoose.Schema({
userId: {type:String},
name: {type:String, required:true},
manufacturer:{type:String, required:true},
description:{type:String, required:true},
mainPepper: {type:String, required:true},
imageUrl:{type:String, required:true},
heat: {type:Number, required:true},
likes: {type:Number},
dislikes : {type:Number},
usersLiked : {type:["String <userId>"]},
usersDisliked: {type:["String <userId>"]},
});
module.exports = mongoose.model('sauce', sauceSchema);
上面的模型在最后有两个数组,这两个数组存储喜欢或不喜欢某个酱料产品的用户的用户ID。
在同一模型上,就在两个阵列的上方,我们发现了两个“计数器”:喜欢和不喜欢。
这款腕表由 Mongoose 制作而成,所有酱汁都储存在MongoDB中。
您有什么问题?
我必须在我的控制器中为这个喜欢/不喜欢系统创建一个路径,为了做到这一点,我希望访问两个数组length,并将该长度的编号值设置为喜欢/不喜欢值。
我读了十几个帖子,尝试了几个选项,但要么我被送回一个未定义的,要么我什么也没说。
到目前为止,您尝试了哪些方法?
这是路由代码,为了清楚起见,仅具有“类似”的情况:
exports.likeSauce = (req,res,next) =>{
const liker = req.body.userId;
let likeStatus = req.body.like;
if(likeStatus === 1){
sauce.updateOne({_id:req.params.id}, {$push:{usersLiked:liker}, $inc:{likes:totalLiked}})
.then(()=>res.status(201).json({message:'you liked this sauce'}))
.catch(error=>res.status(400).json({error}))
}else{}
- liker =喜欢的用户的ID
- likeStatus =前端在请求中发送的值,可以是1(喜欢)或0(无)或-1(不喜欢)。
- usersLiked =从存储喜欢者ID的模型返回字符串数组。
- totalLiked =理想情况下,它将是usersLiked.length编号值,该值将作为喜欢“计数器”值传递并作为数字存储在数据库中。
对于totalLiked,我尝试了前面提到的各种方法,但最终得到了两条非常相似的线:
let totalLiked = sauce.findOne([{$match:{_id:req.params.id}}, {$project:{usersLiked:{$size:'$usersLiked'}}}])
//or//
let totalLiked = sauce.aggregate([{$match:{_id:req.params.id,usersLiked:{$size:'$usersLiked'}}}])
关于这条路线的一个要素,有一点需要说明:
sauce.updateOne({_id:req.params.id}, {$push:{usersLiked:liker}, $inc:{likes:totalLiked}})
我得到了关于'totalLiked'的'undefined'状态的错误,所以我选择将$inc放在管道的末尾,以便'等待'将liker添加到数组中,从而获得一个可以返回可用长度的已定义元素。但也许我确实在这里混淆了事情...
感谢您阅读我的帖子,并为任何帮助,你可能能够证明!
1条答案
按热度按时间2izufjch1#
根据我的经验,mongoose不能很好地使用直接管道。相反,它们有自己的方法链,像这样的方法链每次都能工作