如何在集合mongodb的同一对象中将一个数据字段设置为另一日期字段

时间:2018-12-14 02:10:35

标签: mongodb mongodb-query aggregation-framework

我正在尝试编辑集合中的条目字段。我正在检查lastUpdated日期是否小于发布日期。如果是这样,则该条目可能是错误的,我需要将lastUpdated日期与发布日期相同。我为它创建了以下mongo查询:-

           db.runCommand({ aggregate: "collectionNameHere",pipeline: [
                 {
                   $project: {
                     isFaulty: {$lt: ["$lastUpdated","$published"]}
                   }
                 },{
                   $match: {
                     isFaulty: true
                   }
                 },{
                   $addFields: {
                     lastUpdated: "$published"
                   }
                 }]
              })

我可以获取有此错误的文档列表,但是无法更新该字段。最后的$ addFields似乎不起作用。也没有错误。有人可以帮助我吗,或者他们可以为我的用例提供更好的查询。

非常感谢。

2 个答案:

答案 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 }})
}))