猫鼬updateOne函数:如果$ pull不起作用,则不更新

时间:2020-08-11 12:03:43

标签: mongodb mongoose mongodb-query mongoose-schema

我有一个这样的updateOne方法,

Photo.updateOne(
    {
        "_id": photoId
    },
    {
        "$pull": {
            comments: {
                _id: ObjectID(commentId),
                "user.id": user.id
            }
        },
        "$inc": { "commentCount": -1 },
    },
)

我有一个Photo模型,其中包含作为数组的注释和作为数字的commentCount。当我运行代码时,它可以正常工作,但是如果照片没有注释(我尝试拉出),则它仍然包含commentCount -1。我想要的是,如果代码未在照片注释中提取任何注释,那么也不要更新commentCount。如何将此规则添加到我的代码中。

感谢帮助。

2 个答案:

答案 0 :(得分:1)

Mongo中不存在这样的功能,如果使用Mongo v4.2 +,您可以做的是使用pipelined update,顾名思义,这使您可以在更新中使用管道,从而使我们能够根据先前的结果得出条件。

Photo.updateOne(
    { "_id": photoId },
    [
        {
            $set: {
              comments: {
                  $filter: {
                     input: "$comments",
                     as: "comment",
                     cond: {
                         $and: [
                           {$ne: ["$$comment._id", ObjectID(commentId)]},
                           {$ne: ["$$comment.user.id", user.id]} //really necessary?
                          ]
                     }
                  }
               }
            }
        },
        {
            $set: {
                commentCount: {$size: "$comments"}
            }
        }
    ]
)

对于较小的版本,您必须将其分为2个调用。没办法。

--------------编辑---------------

您可以使用$elemMatch更新查询以查找文档,如果找不到该文档,则意味着该注释属于其他人,在这种情况下您可能会出错。

Photo.updateOne(
    { 
        _id: photoId,
        comments: {
           $elemMatch: {
               _id: objectID(commentId),
               "user.id": user.id
           }
        }
    },
    {
        "$pull": {
            comments: {
                _id: ObjectID(commentId),
                "user.id": user.id
            }
        },
        "$inc": { "commentCount": -1 }
    }
)

答案 1 :(得分:1)

您还可以在查询部分中同时添加字段Collecting package metadata (current_repodata.json): done Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source. Collecting package metadata (repodata.json): done Solving environment: failed PackagesNotFoundError: The following packages are not available from current channels: - python=3.3 Current channels: - https://conda.anaconda.org/conda-forge/win-64 - https://conda.anaconda.org/conda-forge/noarch - https://repo.anaconda.com/pkgs/main/win-64 - https://repo.anaconda.com/pkgs/main/noarch - https://repo.anaconda.com/pkgs/r/win-64 - https://repo.anaconda.com/pkgs/r/noarch - https://repo.anaconda.com/pkgs/msys2/win-64 - https://repo.anaconda.com/pkgs/msys2/noarch comments._id的条件,如果注释不可用,则会跳过更新并提取部分。

comments.use.id