我有一个这样的updateOne方法,
Photo.updateOne(
{
"_id": photoId
},
{
"$pull": {
comments: {
_id: ObjectID(commentId),
"user.id": user.id
}
},
"$inc": { "commentCount": -1 },
},
)
我有一个Photo模型,其中包含作为数组的注释和作为数字的commentCount。当我运行代码时,它可以正常工作,但是如果照片没有注释(我尝试拉出),则它仍然包含commentCount -1。我想要的是,如果代码未在照片注释中提取任何注释,那么也不要更新commentCount。如何将此规则添加到我的代码中。
感谢帮助。
答案 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