mongodb MONGOOSE/NODE JS如何获取数组长度并将其作为计数器值?

huwehgph  于 2022-12-12  发布在  Go
关注(0)|答案(1)|浏览(117)

这个问题与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添加到数组中,从而获得一个可以返回可用长度的已定义元素。但也许我确实在这里混淆了事情...
感谢您阅读我的帖子,并为任何帮助,你可能能够证明!

2izufjch

2izufjch1#

根据我的经验,mongoose不能很好地使用直接管道。相反,它们有自己的方法链,像这样的方法链每次都能工作

let totalLiked = await sauce.aggregate()
    .match({_id: req.params.id})
    .project({usersLiked: {$size: '$usersLiked'}})

相关问题