Node.js 从集合中返回的重复项

Node.js 从集合中返回的重复项,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,博客架构: { 正文:{type:String,必需:true}, 标题:{type:String,必需:true}, 已发布:{type:String,默认值:false}, 日期:{type:date,默认值:date.now}, 用户:{type:Schema.Types.ObjectId,ref:'BlogUser'}, 注释:[{type:Schema.Types.ObjectId,ref:'comments'}], likes:[{user:{type:Schema.Types.Ob

博客架构:

{
正文:{type:String,必需:true},
标题:{type:String,必需:true},
已发布:{type:String,默认值:false},
日期:{type:date,默认值:date.now},
用户:{type:Schema.Types.ObjectId,ref:'BlogUser'},
注释:[{type:Schema.Types.ObjectId,ref:'comments'}],
likes:[{user:{type:Schema.Types.ObjectId,ref:'BlogUser'}]
}
用于添加相似项的相似路径:

exports.likeBlog = async (req, res) => {
  const blog_id = req.params.blog_id;
  const user_id = req.body.user_id;
  await Blog.findByIdAndUpdate(
    blog_id,
    {
      $push: {
        likes: {
          user: user_id,
        },
      },
    },
    { new: true },
    (err, newBlog) => {
      if (err) res.status(422).json(err);
      console.log(newBlog);
      res.json(newBlog);
    }
  );
};
接收博客的博客路径:

exports.getBlogByID=async(req,res)=>{
const blog_id=req.params.blog_id;
试一试{
const blog=await blog.findById(blog\u id)
.填充(“注释”)
.填充(“用户”);
日志(blog);
res.json(博客);
}捕获(错误){
res.status(401).json(错误);
}
};

当我通过从客户端调用
like route
添加like时,我会得到一个拥有正确数量like的博客,即只有1个。但当我从
blog-Route
请求blog时,它会在“likes”数组中返回两个对象,它们彼此相同(id也相同)。为什么我会得到这样的结果?请注意,我在调用“Like-Route”后调用了“Blog-Route”。

将“Like-Route”更改为以下内容后,效果良好:

exports.likeBlog=async(req,res)=>{ const blog_id=req.params.blog_id; const user_id=req.body.user_id; const blog=await blog.findById(blog_id); blog.likes.unshift({user:user_id}); 等待blog.save(); Blog.findById(Blog_id) 。然后((结果)=>{ res.json(结果); }) .catch((错误)=>{ res.status(501).json({error}); }); };
但我仍然不知道这两者之间有什么区别。

在我将“喜欢路线”更改为以下内容后,效果很好:

exports.likeBlog=async(req,res)=>{ const blog_id=req.params.blog_id; const user_id=req.body.user_id; const blog=await blog.findById(blog_id); blog.likes.unshift({user:user_id}); 等待blog.save(); Blog.findById(Blog_id) 。然后((结果)=>{ res.json(结果); }) .catch((错误)=>{ res.status(501).json({error}); }); };
我仍然不知道两者之间有什么区别。

您正在进行$push,因此理论上您可能有两个以上的相同用户。他喜欢同一个博客的次数一样多。是的,但我只推了一次类似的项目。在从客户端添加like后,我禁用like选项@格罗兹1。永远不要相信你的客户。2.检查一下你给likeBlog打了多少次电话。我暗示您的客户机实际上在调用您两次(即使您认为他阻止了),或者您在选项动词e上调用函数两次。g@grodzi所以服务器端没有问题,对吗?而且我只给likeBlog打过一次电话,至少我认为我在这么做。我是否应该将上面的代码替换为客户端代码?您正在执行$push,因此理论上您可能有两个以上的相同用户。他喜欢同一个博客的次数一样多。是的,但我只推了一次类似的项目。在从客户端添加like后,我禁用like选项@格罗兹1。永远不要相信你的客户。2.检查一下你给likeBlog打了多少次电话。我暗示您的客户机实际上在调用您两次(即使您认为他阻止了),或者您在选项动词e上调用函数两次。g@grodzi所以服务器端没有问题,对吗?而且我只给likeBlog打过一次电话,至少我认为我在这么做。我应该将上面的代码替换为客户端代码吗?unshift删除数组的第一个元素(独立于您给他的{user:1}、null或{user:user_id})。您没有修复这样一个事实,即您可能要进行两次更新:一次是添加用户,另一次是删除并再次添加用户。当您添加其他用户时,此操作将失败(第一个用户将被取消链接,并且第二个用户可能会被列出两次…),只需使用3个不同的用户进行尝试,它就可以正常工作。而且unshift并没有删除数组的第一个元素,它实际上是在开头添加新元素。@grodziwhoops您取消shift@yash Boura是对的。我不明白你为什么不推动,但如果它对你有效,那就这样吧。不过,find+write感觉很悲伤。如果是我,我只需要存储一个混合的(id:1)并简单地更新。我甚至不想返回博客,但你有你的constraintsunshift删除数组的第一个元素(独立于你给他的{user:1}、null或{user:user_id})。您没有修复这样一个事实,即您可能要进行两次更新:一次是添加用户,另一次是删除并再次添加用户。当您添加其他用户时,此操作将失败(第一个用户将被取消链接,并且第二个用户可能会被列出两次…),只需使用3个不同的用户进行尝试,它就可以正常工作。而且unshift并没有删除数组的第一个元素,它实际上是在开头添加新元素。@grodziwhoops您取消shift@yash Boura是对的。我不明白你为什么不推动,但如果它对你有效,那就这样吧。不过,find+write感觉很悲伤。如果是我,我只需要存储一个混合的(id:1)并简单地更新。我甚至不想返回博客,但你有你的限制