2017-06-15 61 views
2

我想用表达languge使用下面的查询来生成Nifi getMongo查询场ISO字符串,如何获得ISO字符串中Nifi getMongo查询字段

{ 
"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不会评估表达式语言。有没有任何方法或解决方法来实现这个工作?

在此先感谢

回答

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)" 
} 
1

我想你可能能够使用unescapeJson表达式语言函数来处理这个问题。您必须为字段级别提供有效的JSON(转义引号)(NiFi术语中的PropertyDescriptor)验证,但表达式语言字符串在表达式解析期间预期未转义的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')}" 
} 
} 
+0

我试过unescapeJSON,它没有抛出任何错误或创建任何Mongo查询。 \“yyyy-MM-dd'T'HH:mm:ss.SSS'Z'\”:unescapeJson()这应该如何工作\是否在引号之外? 无论如何要记录Queruy字段的最后一个valye吗? –

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

但它可能在蒙戈查询语言来指定当前和相关日期是这样的:。

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

@安迪,你能评论这个吗? – daggett

+0

如果属性描述符说它不支持EL,那是正确的。归档Jira引用这是添加支持的最佳方式。由于它是开源的,因此也欢迎海报修改其本地副本以评估EL(代码库中的许多现有示例)。 – Andy

+0

在执行动态查询之前使用'UpdateAttribute'来“解析”你的观点也应该有效。 – Andy

1

我有邮件列表上类似的讨论,这里是我找到了解决方案,它的工作原理:

蒙戈控制台:

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

查询字段:

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

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

相关问题