gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:50:31 33 4
gpt4 key购买 nike

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

{
"_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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com