JavaScript函数调用导致;setUTCHours不是一个函数;

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

我有一些MongoDB记录,其中包含OrderDate,我希望将时间组件更新为午夜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")
        }
    }
)
但是我得到了以下错误

“消息”:“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
不是一个有效的函数。

它肯定是一个日期时间。我认为这可能是由于字符串化参数引起的,但将其包装为ISODate
ISODate($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++;}`