如何在 Nifi getMongo 查询字段中获取 ISO 字符串
How to get ISO string in Nifi getMongo Query Field
我正在尝试使用表达式语言在 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 不会评估表达式语言。有什么方法或解决方法可以使它正常工作吗?
提前致谢
我认为您可以使用 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')}"
}
}
我在 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 查询字段不支持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)"
}
我在邮件列表上进行了类似的讨论,这是我发现有效的解决方案:
Mongo 控制台:
db.system.js.save({
"_id": "lastFiveMinutes",
"value": function() {
return new Date(ISODate().getTime() - (1000 * 60 * 5));
}
});
db.loadServerScripts();
查询字段:
{
"$where": "obj.ts >= lastFiveMinutes()"
}
注意:您可能希望在日程安排 属性 的计时器上设置此功能。
nifi 的 GetMongo 处理器要求您的查询采用 mongo.So 的扩展 json 格式,您可以使用以下格式的查询来根据日期时间查询 mongo:
{"bday":{"$gt":{"$date":"2014-01-01T05:00:00.000Z"}, "$lt" :{"$date":"2019-01-
01T05:00:00.000Z"}}}
我知道这很老post,但我花了很多时间找到了一个适合我的解决方案。
使用 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})}}
我正在尝试使用表达式语言在 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 不会评估表达式语言。有什么方法或解决方法可以使它正常工作吗?
提前致谢
我认为您可以使用 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')}"
}
}
我在 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 查询字段不支持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)"
}
我在邮件列表上进行了类似的讨论,这是我发现有效的解决方案:
Mongo 控制台:
db.system.js.save({
"_id": "lastFiveMinutes",
"value": function() {
return new Date(ISODate().getTime() - (1000 * 60 * 5));
}
});
db.loadServerScripts();
查询字段:
{
"$where": "obj.ts >= lastFiveMinutes()"
}
注意:您可能希望在日程安排 属性 的计时器上设置此功能。
nifi 的 GetMongo 处理器要求您的查询采用 mongo.So 的扩展 json 格式,您可以使用以下格式的查询来根据日期时间查询 mongo:
{"bday":{"$gt":{"$date":"2014-01-01T05:00:00.000Z"}, "$lt" :{"$date":"2019-01-
01T05:00:00.000Z"}}}
我知道这很老post,但我花了很多时间找到了一个适合我的解决方案。
使用 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})}}