Mongodb updateMany 属性为其他属性的精确值

标签 mongodb

我有代表用户的文档,其中的入职数据存储为嵌套对象:

{
    "_id" : ObjectId("5c7eb0132e6f793bcc7f4bf7"),
    "userName" : "sample_user_name",
    "onBoarding" : {
        "completed" : ISODate("2019-03-05T17:46:28.803Z"),
        "stepId" : 8,
        "started" : null
    }
}

但由于错误,我们错过了入职开始的日期,我想通过运行更新操作来“检索”此信息,其中“开始”将设置为与“完成”相同的日期。我有一个查询,例如:

db.getCollection('user').updateMany(
{ 
  $and: [
      {"onBoarding.started": {$exists: false}},
      {"onBoarding.completed": {$exists: true}}
]}, 
{
  $set: { "onBoarding.started": "$onBoarding.completed" }
})

但是,这会将“started”设置为“$onBoarding”字面意思(作为字符串)。

{
    "_id" : ObjectId("5c7eb0132e6f793bcc7f4bf7"),
    "userName" : "sample_user_name",
    "onBoarding" : {
        "completed" : ISODate("2019-03-05T17:46:28.803Z"),
        "stepId" : 8,
        "started" : "$onBoarding"
    }
}

我应该如何编写让 mongo 从“onBoarding.completed”中获取值并将该值复制到“onBoarding.started”? 预期结果文档应如下所示:

{
    "_id" : ObjectId("5c7eb0132e6f793bcc7f4bf7"),
    "userName" : "sample_user_name",
    "onBoarding" : {
        "completed" : ISODate("2019-03-05T17:46:28.803Z"),
        "stepId" : 8,
        "started" : ISODate("2019-03-05T17:46:28.803Z")
    }
}

最佳答案

您需要使用聚合管道才能使用另一个字段的值:

db.user.updateMany(
   { <your query selector > },
   [
      { $set: { onBoarding.started: "$onBoarding.completed" } },
   ]
)

请注意,此处 $set 指的是聚合管道阶段,而不是更新运算符 $set : https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/index.html#update-with-aggregation-pipeline

关于Mongodb updateMany 属性为其他属性的精确值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59253513/

相关文章:

json - : cannot use the part to traverse the element更新时Mongo报错

python - pymongo $set 子文档数组

MongoDB 地理相交无法找到大多边形

mongodb - 查找在指定日期之前创建的所有对象

javascript - 选择检查主体时如何更新 MongoDB 中的数据

mongodb - Mongodb查找条件: not exist

mongodb - 没有索引的MongoDB搜索真的很慢吗?

javascript - 更新数组中的最后一项

mysql - Mongodb : Query based on time in ISODate format. 我的查询有什么问题?

java - 无法使用java插入MongoDB