检查对象是否在对象数组中-javascript

时间:2019-12-02 15:55:16

标签: javascript node.js

我知道我必须使用some,但是由于某种原因,我似乎无法正确使用它。我的mongodb数据库中有一个帖子集。每个帖子都有一个名为“喜欢”的对象数组,该对象引用喜欢此帖子的用户。所以在我的后端,我想检查用户是否存在于帖子的likes数组中。如果它不存在,则类似于该帖子,否则在我的反应前端返回一条适当的消息。我将包括的代码始终从some返回false,因此用户可以无限次喜欢发布。

exports.postLike = async (req, res, next) => {
  const postId = req.query.postId;
  const userId = req.query.userId;


  console.log('postId: ' + postId);

  try{
    const post = await Post.findById(postId).populate('creator').populate('likes');
    const user = await User.findById(userId);
    if (!post.likes.some(post => post._id === user._id)){
      post.likes.push(user);
      console.log('liked a post');
      const result = await post.save();
      res.status(200).json({ message: 'Post liked!', post: result });
    } else {
      console.log('Post already liked!');
      res.status(200).json({ message: 'Post already liked!', post: post });
    }

  }catch (err) {
    if (!err.statusCode) {
      err.statusCode = 500;
    }
    next(err);
  }

};

我显然还不了解some的工作原理,因此,如果您能帮助的话,那会很棒。如果您在这种情况下还有其他解决方案,也请发布。我尝试了一些与indexOf的随机代码,并包括检查,但它也不起作用。我不确定这是检查用户对象是否包含在“喜欢”对象数组中的正确方法。我宁愿不编写自己的任何函数来对此进行检查,我想使用javascript提供的现有函数/方法来做到这一点。

2 个答案:

答案 0 :(得分:1)

MongoDB.ObjectId是围绕primitve的包装,就像NumberBoolean一样。就像

  new Boolean(true) === new Boolean(true)

将为假,您的比较也会失败。您必须将原始图元进行比较:

 post._id.valueOf() === user._id.valueOf()

答案 1 :(得分:1)

将在此处提供其他路线。您正在获取所有数据,包括与创建者的联接,并且喜欢对集合进行添加。这有点浪费,可以通过执行update并使用$addToSet来实现,如果不存在,将添加之类的东西。

然后,您只需检查结果中的nModified即可知道是否已添加。因此,您可以:

const result = await Post.updateOne(
    {
        id: 1
    },
    {
        $addToSet: {
            likes: {
                userId: mongoose.Types.ObjectId(req.query.userId)
            }
        }
    }
);

console.info(result.nModified === 1);

或者,您可以使用some来使用===来比较类型和值,如下所示:

posts.likes.some(like => like.userId.toString() === req.query.userId)