我写了这个聚合管道。我想更新此管道中匹配的文档并根据阶段进行更新。我假设 $replaceRoot 会做到这一点。我是否错了。我只是想知道聚合管道是否可以更新文档。如果是的话,这是最佳实践还是黑客。而且我不想使用 $out 运算符。
[
{ $match: { name: "awss3-metadata-loader" } },
{
$set: {
tags: {
$cond: {
if: {
$in: [{ $type: "$tags" }, ["null"]],
},
then: [
{
k: "awss3metadataloader",
v: "new",
},
],
else: {},
},
},
},
},
{ $replaceRoot: { newRoot: "$$ROOT" } },
]```
是的,这是可能的。您可以使用
db.collection.updateMany({<filter>}, [<pipeline>])
或db.collection.updateOne()
将会
请注意,管道必须仅包含以下聚合阶段:
$addFields
及其别名$set
$project
及其别名$unset
$replaceRoot
及其别名$replaceWith
你的例子就是这种情况。
请参阅使用聚合管道进行更新
或者您可以使用$merge运算符。