如何将更多字段(在猫鼬模式中)添加到一个字段(这是一个对象数组)中,并且这些对象引用另一个猫鼬模式?

时间:2020-10-29 12:18:05

标签: node.js express mongoose

我有一个用户的猫鼬模式,该用户具有一个viewes_posts字段,该字段是一个对象数组,这些对象引用了另一个猫鼬模式(post)。现在,我想在此对象数组中添加两个以上字段。

我这样尝试过:

viewed_posts: [
    {
      hits: {type: Number, default: 0},
      actualViewsByUser: {type: Number, default: 0},
      type: mongoose.Schema.Types.ObjectId,
      ref: "Post"
    }
  ]

但是当我使用User.populate(“ viewed_posts”)函数时,它不会显示“ hits”和“ actualViewsByUser”,而只会显示帖子架构的完整字段。

这是我要访问这些字段的代码:

User.findById(req.user._id).populate("viewed_posts").exec(function(err,user){
      if(err) console.log(err);
      else{
        console.log("usre found , now we are going to update the views")
        Post.findOne({slug: req.params.slug},(err,post)=>{
          if(err) console.log(err);
          else{
            user.viewed_posts.push(post);
            user.save();
            let index= 0;
            console.log("viewed_posts.length",user.viewed_posts.length);
            for(var i=0;i<user.viewed_posts.length;i++){
              console.log("post.slug", post.slug)
              console.log("user.viewed_posts.slug", user.viewed_posts[i].slug)
              if(post.slug === user.viewed_posts[i].slug){
                console.log(user.viewed_posts[i]);
                index = i;
                break;
              }
            }
            console.log("index  : ", index);
            console.log("increasing number of hits each time this particular user visits this post");
            console.log("user.viewed_posts.hits before  : " , user.viewed_posts[index].data.hits)
            user.viewed_posts[index].hits +=1;
            console.log("user.viewed_posts.hits after  : " , user.viewed_posts[index].data.hits)
            console.log("increasing number of hits of the post no matter how many times any user visit here");
            console.log("post.views before  : " , post.views)
            post.views +=1;
            console.log("post.views after  : " , post.views)
            if(user.viewed_posts[index].actualViewsByUser != 4){
              console.log("increasing number of actualViews of this post only if this user haven't visited more than 4 times");
              console.log("post.actualViews before  : " , post.actualViews)
              post.actualViews +=1;
              console.log("post.actualViews after  : " , post.actualViews)
              post.save((err,post)=>{
                if(err) console.log(err)
                else console.log("post saved sucessfully",post);
              });
              console.log("user.viewed_posts.actualViewsByUser after  : " , user.viewed_posts[index].actualViewsByUser)
              user.viewed_posts.actualViewsByUser += 1;
              console.log("user.viewed_posts.actualViewsByUser after  : " , user.viewed_posts[index].actualViewsByUser)
            }
            
            
          }
        })
      }
    })

这是输出:

increasing number of hits each time this particular user visits this post
user.viewed_posts.hits before  :  undefined
user.viewed_posts.hits after  :  NaN
increasing number of hits of the post no matter how many times any user visit here
post.views before  :  0
post.views after  :  1
increasing number of actualViews of this post only if this user haven't visited more than 4 times
post.actualViews before  :  0
post.actualViews after  :  1
user.viewed_posts.actualViewsByUser after  :  undefined
user.viewed_posts.actualViewsByUser after  :  undefined

我该怎么做才能将这两个字段(hits,actualViewsByUser)集成到此字段(viewed_posts)中?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

因为必须指定要填充的字段。

User.findById(req.user._id).populate("viewed_posts", "hits actualViewsByUser", Post) // pass in the Post model as well (you'll have to import this).

我传入模型是因为之前有错误,因为猫鼬没有正确填写我的字段。

但是,我不确定您的方法是最好的方法。 “点击数”和“ actualViewsByUser”将通过ID引用特定的帖子。当您使用填充猫鼬时,将获取ID,查找相关帖子,然后填充适当的信息“匹配”,“ actualViewsByUser”等。“匹配”和“ actualViewsByUser”需要存储在您的Post模型中,不是您的用户模型。

相关问题