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

时间:2017-06-15 17:35:16

标签: mongodb el apache-nifi

我正在尝试使用表达语言在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错误错误。当我们尝试使用\ operator转义它时,nifi不会评估表达式语言。是否有任何方法或解决方法可以使这个工作?

提前致谢

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我认为您可以使用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')}"
}
}

答案 2 :(得分:1)

我在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)
    }
}

答案 3 :(得分:1)

Nifi的getMongo查询字段不支持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查询中,

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

答案 4 :(得分:1)

我在邮件列表上进行了类似的讨论,这是我找到的解决方案:

Mongo控制台:

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

查询字段:

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

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

答案 5 :(得分:0)

我知道这是一篇很老的帖子,但我花了很多时间找到了一个对我有用的解决方案。

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

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

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

enter image description here

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

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