我有一些具有OrderDate的MongoDB记录,我希望将时间部分更新为午夜00:00:00.000。对象的形式为
{
"SourceSystem" : "XXXX"
"OrderDate" : {
"DateTime" : ISODate("2017-11-29T00:00:00.000+00:00"),
"Ticks" : 636475104000000000
}
}
为此,我具有以下JavaScript
function generateDate(targetDateTime){
let ticks = targetDateTime.getTime() * 10000;
ticks += 621355968000000000;
return {
DateTime: targetDateTime,
Ticks: NumberLong(ticks)
};
}
function datePartOnly(targetDateTime){
targetDateTime.setUTCHours(0, 0, 0, 0);
return generateDate(targetDateTime);
}
let orders = db.Orders.aggregate([
{
$match: {
State: { $in: [ "Completed", "AwaitingExport" ] },
SourceSystem: "Demon",
OrderDate: {
$gte: generateDate(ISODate("20200101")),
$lt: generateDate(ISODate("20200701"))
}
}
},
{
$addFields: {
OrderDateString: {
$dateToString: {
format: "%H%M%S.%L",
date: "$OrderDate.DateTime"
}
}
}
},
{
$match: {
OrderDateString: /^((?!0{6}\.0{3})[\s\S])*$/
}
},
{
$project: { _id: 1 }
}
]).toArray().map( o => o._id );
db.Orders.updateMany(
{
_id: { $in : orders }
},
{
$set : {
OrderDate: datePartOnly("$OrderDate.DateTime")
}
}
)
但出现以下错误
“ message”:“ targetDateTime.setUTCHours不是函数”,“ stack”:“ script:11:20” +“脚本:52:24”
为什么此呼叫失败。我尝试使用OrderDate: datePartOnly(ISODate("$OrderDate.DateTime"))
,但这给出了
“ message”:“无效的ISO日期:$ OrderDate.DateTime”,“ stack”:“ script:1:37” +“脚本:1:37” +“脚本:52:37”
以上内容有什么问题?
[机会很少,您可能因为targetDateTime
而传递的参数不是Date对象(或具有此函数的任何类型)?这可以解释为什么targetDateTime.setUTCHours
不是有效函数。