JavaScript函数调用导致“ setUTCHours不是函数”

问题描述 投票:2回答:1

我有一些具有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”

以上内容有什么问题?

javascript mongodb function
1个回答
0
投票

[机会很少,您可能因为targetDateTime而传递的参数不是Date对象(或具有此函数的任何类型)?这可以解释为什么targetDateTime.setUTCHours不是有效函数。

© www.soinside.com 2019 - 2024. All rights reserved.