mongoose.Model.updateOne不适用于嵌套属性查询

时间:2018-12-22 14:16:40

标签: node.js mongoose

我有一个用于博客应用程序的简单api,在猫鼬模型中使用updateOne()deleteOne()方法更新/删除单个帖子时遇到问题。

逻辑很简单,通过在查询参数中传递的id来查找帖子,并且另外的要求是,帖子的所有者ID必须等于通过令牌传递并可以通过中间件访问的当前用户的id。

测试文章文档:

{
      "likes": 0,
      "dislikes": 0,
      "_id": "5c1a49464030141b3cc357c6",
      "owner": {
            "id": "5c1a49074030141b3cc357c5",
             "firstName": "John",
             "lastName": "Smith",
             "avatarSrc": "/profile-avatars/avatar1545226503543.jpg"
      },
      "title": ".....",
      "text": ".....",
      "previewSrc": "/post-previews/preview1545226565915.PNG",
      "__v": 0
}

应该更新帖子的代码:

router.put('/:id', authCheck, (req, res) => {
    Post.updateOne({_id: req.params.id, 'owner.id': req.userId}, req.body)
        .then((result) => {
            console.log(result);
            res.sendStatus(200);
        });
});

问题在“ owner.id”查询中,正确接收了postId和userId,但未发生更新。

2 个答案:

答案 0 :(得分:0)

我将执行以下操作,尤其是某些属性不会更改;未经测试,但想知道结果

router.put('/:id', authCheck, (req, res) => {
    let updateObj = {
          likes: req.body.likes,
          dislikes: req.body.dislikes,
          title: req.body.title,
          text: req.body.text,
          previewSrc: req.previewSrc
    }
    Post.updateOne({_id: req.params.id, 'owner.id': req.userId}, updateObj)
        .then((result) => {
            console.log(result);
            res.sendStatus(200);
        });
});

答案 1 :(得分:0)

好的,我发现了问题: 这些id字符串是字符串对象,而不是简单的字符串,要对其进行检查: 1)首先通过ID提取帖子,然后将owner.id与请求中的userId进行比较,发现它们不相等; 2)将字符串与equals方法进行比较,并返回true。

因此可以通过以下方式解决问题: 1)仅通过ID获取帖子; 2)提取帖子后,使用equals方法比较其ID。