JavaScript函数调用导致;setUTCHours不是一个函数;
我有一些MongoDB记录,其中包含OrderDate,我希望将时间组件更新为午夜00:00:00.000。对象是形式的JavaScript函数调用导致;setUTCHours不是一个函数;,javascript,mongodb,function,Javascript,Mongodb,Function,我有一些MongoDB记录,其中包含OrderDate,我希望将时间组件更新为午夜00:00:00.000。对象是形式的 { "SourceSystem" : "XXXX" "OrderDate" : { "DateTime" : ISODate("2017-11-29T00:00:00.000+00:00"), "Ticks" : 636475104000000000 } } 为此,我有以下JavaScript function ge
{
"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")
}
}
)
但是我得到了以下错误
“消息”:“targetDateTime.setUTCHours不是函数”,
“堆栈”:“脚本:11:20”+
“剧本:52:24”
为什么这个电话失败了。我尝试过使用OrderDate:datePartOnly(ISODate($OrderDate.DateTime))
,但这会
“消息”:“无效的ISO日期:$OrderDate.DateTime”,
“堆栈”:“脚本:1:37”+
“剧本:1:37”+
“剧本:52:37”
OrderDate:datePartOnly(日期($OrderDate.DateTime))
也不起作用
上面的问题是什么 很可能,您作为
targetDateTime
传递的参数不是日期对象(或具有此类函数的任何类型)吗?这可以解释为什么targetDateTime.setUTCHours
不是一个有效的函数。它肯定是一个日期时间。我认为这可能是由于字符串化参数引起的,但将其包装为ISODateISODate($OrderDate.DateTime”)
不起作用,Date($OrderDate.DateTime”)
@CipherShark确切地说,是日期时间,而不是日期。我检查了MDN和setUTCHours的起始日期(检查这里:)。除非ISODate或DateTime继承自Date类型,否则我认为不太可能工作,因为该方法根本不存在——正如我所见。尽管如此,我坚信这是一个数据类型问题。但这是有效的`函数(order){order.OrderDate.DateTime.setUTCHours(0,0,0,0);order.OrderDate.Ticks=NumberLong((order.OrderDate.DateTime.getTime()*10000)+62135596800000000);db.targetCollection.save(order);counter++;}`