【问题标题】:mongoose.Model.updateOne doesn't work with nested property querymongoose.Model.updateOne 不适用于嵌套属性查询
【发布时间】:2018-12-22 14:16:39
【问题描述】:

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

逻辑很简单,通过查询参数中传入的id查找帖子,另外要求帖子的所有者id必须等于当前用户的id,通过token传入并通过中间件可用。

测试后文档:

{
      "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被正确接收但没有更新。

【问题讨论】:

  • 请问您为什么要通过_idowner.id 查询?为什么不只是_id?这实际上会运行得更慢。如果_id 是唯一的,则不会重复;因此,您无需检查 2 个属性是否为真。
  • @MuhandJumah 用于授权目的。只有创建了特定帖子的用户才能编辑他
  • 我明白了,我会将owner 设为索引,否则会导致性能不佳。回到你的问题,问题似乎是req.userId 你能做console.log(req.userId) 并确认输出吗?
  • @MuhandJumah 是的,我已经检查了 10 次,它是正确的
  • 我明白了,好吧,我们肯定知道一件事,一个帖子不能有不同的owner,或者不同的_id,也不能有不同的__v,所以我们可以将更新更改为不包括那些?这样我们就可以得出一个结论是什么问题

标签: node.js mongoose


【解决方案1】:

我会做以下事情,尤其是一些属性不会改变;未测试但想知道结果

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);
        });
});

【讨论】:

    【解决方案2】:

    好的,我找到了问题: 这些 id 字符串是字符串对象,而不是简单的字符串,要检查它我: 1)先通过它的id获取post,然后比较owner.id和request中的userId,发现不相等; 2)用equals方法比较字符串,返回true。

    所以问题可以这样解决: 1) 仅通过其 id 获取帖子; 2)获取帖子后将其id与equals方法进行比较。

    【讨论】:

    • 想到了这一点,但由于您的owner 具有id 而不是_id 的属性,我认为这是一个自定义id - 将您的答案标记为正确:D
    猜你喜欢
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    相关资源
    最近更新 更多