我正在尝试编辑集合中的条目字段。我正在检查lastUpdated日期是否小于发布日期。如果是这样,则该条目可能是错误的,我需要将lastUpdated日期与发布日期相同。我为它创建了以下mongo查询:-
db.runCommand({ aggregate: "collectionNameHere",pipeline: [
{
$project: {
isFaulty: {$lt: ["$lastUpdated","$published"]}
}
},{
$match: {
isFaulty: true
}
},{
$addFields: {
lastUpdated: "$published"
}
}]
})
我可以获取有此错误的文档列表,但是无法更新该字段。最后的$ addFields似乎不起作用。也没有错误。有人可以帮助我吗,或者他们可以为我的用例提供更好的查询。
非常感谢。
答案 0 :(得分:1)
您通过尝试进行聚集更新来犯错,这是不可能的。您必须使用update命令来实现您的目标。
目前无法对其进行测试,但这应该可以完成工作:
db.collection.update({
$expr: {
$lt: [
"$lastUpdated",
"$published"
]
}
},
{$set:{lastUpdated:"$published"}}
)
答案 1 :(得分:0)
无法使用相同的字段更新文档。您可以使用$out
聚合
db.collection.aggregate([
{ "$match": { "$expr": { "$lt": ["$lastUpdated", "$published"] }}},
{ "$addFields": { "lastUpdated": "$published" }}
])
在这里,但是它总是创建一个新的集合作为“输出”,这在这里也不是解决方案。
因此,最后您必须在此处使用一些迭代才能首先使用find
查询来查找文档,然后需要对其进行更新。借助async
await
,现在很容易使用这种嵌套的异步循环。
const data = await db.collection
.find({ "$expr": { "$lt": ["$lastUpdated", "$published"] }})
.project({ lastUpdated: 1 })
.toArray()
await Promise.all(data.map(async(d) => {
await db.collection.updateOne({ _id: d._id }, { $set: { lastUpdated: d.published }})
}))