我知道转换第一级日期的方法
db.collection.find().forEach(function(x){
x.DateField = ISODate(x.DateField);
db.collection.save(x);})
这适用于第一级字段,但是如果我想更改以下json示例中的数组CreatedTime
中的对象的字段,该怎么办:
{
"Pharmacy": "b",
"Medicine": [
{
"MedName": "MedB",
"Quantity": 60,
"CreatedTime" : "2006-05-05T11:44:47.86Z"
},
{
"MedName": "MedC",
"Quantity": 34,
"CreatedTime" : "2006-11-23T12:28:44.86Z"
}
]
}
答案 0 :(得分:1)
db.getCollection('test').find({}).forEach(function(doc) {
doc.Medicine.forEach(function(doc1){
var dbl = new Date(doc1.CreatedTime);
doc1.CreatedTime = dbl;
});
db.test.save(doc);
});
已编辑:======= 第二种方法:Source
db.logmessages.aggregate( [ {
$project: {
date: {
$dateFromString: {
dateString: '$date',
timezone: 'America/New_York'
}
}
}
} ] )
答案 1 :(得分:1)
您可以使用汇总查询和批量更新中的光标来更新4.0版本的文档。
将$map
与$toDate
结合使用以保留现有值并将字符串date转换为日期类型。
这是外壳样本。
var bulk = db.collection.initializeUnorderedBulkOp();
var count = 0;
var batch = 50; // Change batch size as you need
db.collection.aggregate([
{"$project":{
"Medicine":{
"$map":{
"input":"$Medicine",
"in":{
"MedName":"$$this.MedName",
"Quantity":"$$this.Quantity",
"CreatedTime":{"$toDate":"$$this.CreatedTime"}
}
}
}
}}
]).forEach(function(doc){
bulk.find( {"_id" : doc._id}).updateOne(
{ "$set": {"Medicine" : doc.Medicine}}
);
count++;
if (count == batch) {
bulk.execute();
bulk = db.collection.initializeUnorderedBulkOp();
count = 0;
}
});
if (count > 0) {
bulk.execute();
}