如何将数组中的日期字符串更新为 mongoDB 中的日期格式?
How to update date string in array to date format in mongoDB?
我的 mongoDB collection 看起来像这样:
[
{
"id": "myid",
"field": {
"total": 1,
"subfield": [
{
"time": "2020-08-06T08:33:57.977+0530"
},
{
"time": "2020-05-08T04:13:27.977+0530"
}
]
}
},
{
"id": "myid2",
"field": {
"total": 1,
"subfield": [
{
"time": "2020-07-31T10:15:50.184+0530"
}
]
}
}
]
我需要更新所有文档并将 subfield
数组中可用字段 time
中的日期字符串转换为 mongoDB ISO 日期格式。
我在 subfield
数组
中有数千个文档和数百个 objects
我知道聚合函数 $todate
和 $convert
。
但我不想使用聚合,因为,
要使用 $todate
或 $convert
,我需要展开 field.subfield
数组,这又是一项昂贵的操作。
我想更新我的文档并用日期格式保存它。
My MongoDB server version: 4.0.3
我尝试了以下方法,但它似乎不起作用,也没有 return 任何错误。
db.collection.find().forEach(function(doc) {
doc.field.subfield.time=new ISODate(doc.field.subfield.time);
db.collection.save(doc);
})
您错过了 subfield
的循环,因为它是一个数组,
db.collection.find().forEach(function(doc) {
doc.field.subfield.forEach(function(r) {
r.time = new ISODate(r.time);
})
db.collection.save(doc);
})
如果这是一次那么时间并不重要,我认为如果你使用聚合或 forEach,两者将花费相同的时间。
如果您打算更新 MongoDb 版本,则从 4.2 开始,
您可以使用 update with aggregation pipeline、
使用 updateMany()
更新的选项
db.collection.updateMany({},
[{
$set: {
"field.subfield": {
$map: {
input: "$field.subfield",
as: "r",
in: {
$mergeObjects: [
"$$r",
{ time: { $toDate: "$$r.time" } }
]
}
}
}
}
}]
)
我的 mongoDB collection 看起来像这样:
[
{
"id": "myid",
"field": {
"total": 1,
"subfield": [
{
"time": "2020-08-06T08:33:57.977+0530"
},
{
"time": "2020-05-08T04:13:27.977+0530"
}
]
}
},
{
"id": "myid2",
"field": {
"total": 1,
"subfield": [
{
"time": "2020-07-31T10:15:50.184+0530"
}
]
}
}
]
我需要更新所有文档并将 subfield
数组中可用字段 time
中的日期字符串转换为 mongoDB ISO 日期格式。
我在 subfield
数组
我知道聚合函数 $todate
和 $convert
。
但我不想使用聚合,因为,
要使用
$todate
或$convert
,我需要展开field.subfield
数组,这又是一项昂贵的操作。我想更新我的文档并用日期格式保存它。
My MongoDB server version: 4.0.3
我尝试了以下方法,但它似乎不起作用,也没有 return 任何错误。
db.collection.find().forEach(function(doc) {
doc.field.subfield.time=new ISODate(doc.field.subfield.time);
db.collection.save(doc);
})
您错过了 subfield
的循环,因为它是一个数组,
db.collection.find().forEach(function(doc) {
doc.field.subfield.forEach(function(r) {
r.time = new ISODate(r.time);
})
db.collection.save(doc);
})
如果这是一次那么时间并不重要,我认为如果你使用聚合或 forEach,两者将花费相同的时间。
如果您打算更新 MongoDb 版本,则从 4.2 开始, 您可以使用 update with aggregation pipeline、
使用updateMany()
更新的选项
db.collection.updateMany({},
[{
$set: {
"field.subfield": {
$map: {
input: "$field.subfield",
as: "r",
in: {
$mergeObjects: [
"$$r",
{ time: { $toDate: "$$r.time" } }
]
}
}
}
}
}]
)