如何在Nifi getMongo查询字段中获取ISO字符串



>我正在尝试使用以下查询在 Nifi getMongo 查询字段中生成 ISO 字符串,

{
"remindmeDate": {
"$gte": "${now():format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",'GMT')}",
"$lte": "${now():toNumber():plus(359999):format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",'GMT')}"
}
}

但是我收到无效的 JSON 错误错误,因为双引号没有转义。当我们尝试使用 \ 运算符转义它时,nifi 不会评估表达式语言。有什么方法或解决方法可以使其工作吗?

提前致谢

nifi 的 GetMongo 处理器要求查询采用 mongo 的扩展 json 格式。因此,您可以使用以下格式的查询根据日期时间查询mongo:

{"bday":{"$gt":{"$date":"2014-01-01T05:00:00.000Z"}, "$lt" :{"$date":"2019-01- 
01T05:00:00.000Z"}}}

我在处理器中使用了未更改UpdateAttribute表达式来评估新的 flowFile 属性。

您的表达方式:

{
"remindmeDate": {
"$gte": "${now():format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",'GMT')}",
"$lte": "${now():toNumber():plus(359999):format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",'GMT')}"
}
}

结果:

{
"remindmeDate": {
"$gte": "2017-06-16T07:38:04.811Z",
"$lte": "2017-06-16T07:44:04.810Z"
}
}

这是一个正确的 JSON 对象。

最后我发现GetMongo.Query属性不支持nifi表达式语言(nifi 1.2.0和1.3.0(。只需将问号悬停在参数附近即可。

这意味着无法构建动态查询 (

似乎需要注册一个问题...https://issues.apache.org/jira/browse/NIFI-4082

但是可以在 mongo 查询语言中指定当前和相对日期。 像这样:

{
    "remindmeDate": {
        "$gte": new Date(),
        "$lte": new Date(ISODate().getTime() + 359999)
    }
}

Nifi 的 getMongo Query 字段不支持 EL。所以我在MongoDB中为我的动态查询创建了一个存储函数,并从Nifi调用了它。

{
    "_id" : "reminderDateGMT",
    "value" : function (reminderDateGMT) {
            var reminder = new Date(reminderDateGMT)
            var fromDate = new Date();
            var toDate = new Date(new Date().getTime()+(1000 * 60 * 60));
            if ((reminder >= fromDate) && (reminder <=toDate )) {
                return true;
            } else {
                return false;
            }
        }
}

在nifi GetMongo Query中,

{
  "$where": "reminderDateGMT(this.reminderDateGMT)"
}

我认为您可以使用unescapeJson表达式语言函数来处理这个问题。您必须为字段级别(NiFi 用语中的PropertyDescriptor(验证提供有效的 JSON(转义引号(,但表达式语言字符串在表达式解析期间需要未转义的 JSON,因此 unescapeJson 函数首先删除转义,然后format接收正确引号的字符串。

{
"remindmeDate": {
"$gte": "${now():format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'":unescapeJson(),'GMT')}",
"$lte": "${now():toNumber():plus(359999):format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'":unescapeJson(),'GMT')}"
}
}

我在邮件列表中进行了类似的讨论,这是我发现有效的解决方案:

蒙戈控制台:

db.system.js.save({
    "_id": "lastFiveMinutes",
    "value": function() {
        return new Date(ISODate().getTime() - (1000 * 60 * 5));
    }
});
db.loadServerScripts();

查询字段:

{
    "$where": "obj.ts >= lastFiveMinutes()"
}

注意:您可能希望在调度属性中的计时器上设置此项。

我知道这是一篇很古老的帖子,但我花了很多时间并找到了一个适合我的解决方案。

使用更新属性处理器并创建了两个属性来计算日期范围,我需要获取 mongo 文档:

开始日期: "${now():format('yyyy-MM-dd')}"

结束日期 : "${now():toNumber():plus(86400000):format('yyyy-MM-dd')}"

在此处输入图像描述

之后,将这些属性传递给GetMongo处理器:

查询 : {"createdDate":{"$gte":ISODate(${startDate}), "$lt":ISODate(${endDate})}}

最新更新