我需要在日期匹配查询时选择id



My json.file

[  
{
"id": 0000001,
"created_at": "2021-01-28T17:29:35.888Z"
},
{
"id": 0000002,
"created_at": "2020-12-11T17:29:38.655Z"
},
{
"id": 0000003,
"created_at": "2020-12-11T17:29:37.233Z"
},
{
"id": 0000004,
"created_at": "2020-03-30T16:23:59.682Z"
}
]  

我查询

首先:我得到当天的日期

( now | gmtime | strftime("%Y-%m-%dT%H:%M:%S.%Z") 
然后:我把它转换成数组
| strptime("%FT%T.%Z") [0:6] ) as $f 

然后:我希望它只显示符合条件的id

| map(select(
.id | $f[0] == (.[].created_at | strptime("%FT%T.%Z")[0]) and
$f[1] == (.[].created_at | strptime("%FT%T.%Z")[1])
))

如果发现条件正确,它将显示所有记录。但我只需要匹配的id。我犯了什么错?

得到的结果:

[
{
"id": 1,
"created_at": "2021-01-28T17:29:35.888Z"
},
{
"id": 2,
"created_at": "2020-12-11T17:29:38.655Z"
},
{
"id": 3,
"created_at": "2020-12-11T17:29:37.233Z"
},
{
"id": 4,
"created_at": "2020-03-30T16:23:59.682Z"
}
]

我期望的结果:

{
"id": 1,
"created_at": "2021-01-28T17:29:35.888Z"
},

你只需要:

( now | gmtime | strftime("%Y-%m") ) as $this_month
| .[]
| select( .created_at | startswith($this_month) )

金桥玩

这个回答的其余部分针对OP的代码。


问题# 0

不是真正的问题,但很多必要的工作正在做。gmtime已经返回一个日期-时间组件数组,所以

now | gmtime | strftime("%Y-%m-%dT%H:%M:%S.%Z") | strptime("%FT%T.%Z")[0:6]

又名

now | gmtime | strftime("%FT%T.%Z") | strptime("%FT%T.%Z")[0:6]

简化了

now | gmtime[0:6]

同样,切片是不需要的。

now | gmtime

警告:在这个新版本中,秒分量是小数(例如23.489198923110962)而不是整数(例如23),但这对我们来说不是问题。


问题# 1

.id.[].created_at没有意义。

.id | $f[0] == ( .[].created_at | strptime("%FT%T.%Z")[0] ) and
$f[1] == ( .[].created_at | strptime("%FT%T.%Z")[1] )

应该

$f[0] == ( .created_at | strptime("%FT%T.%Z")[0] ) and
$f[1] == ( .created_at | strptime("%FT%T.%Z")[1] )

这与以下相同:(只是我的偏好)

( .created_at | strptime("%FT%T.%Z")[0] ) == $f[0] and
( .created_at | strptime("%FT%T.%Z")[1] ) == $f[1]

我们可以提出.created_at

.created_at | strptime("%FT%T.%Z")[0] == $f[0] and
strptime("%FT%T.%Z")[1] == $f[1]

我们还可以提出对strptime的调用。

.created_at | strptime("%FT%T.%Z") | .[0] == $f[0] and .[1] == $f[1]

这使我们得到这个:

( now | gmtime ) as $f 
| map(select( .created_at | strptime("%FT%T.%Z") | .[0] == $f[0] and .[1] == $f[1] ))

金桥玩


问题# 2

我们需要将数组平展。

... | map(select(...))

应该

... | map(select(...)) | .[]

当然,我们可以先平化,这样我们就可以避免使用map

... | .[] | select(...)

这使我们得到这个:

( now | gmtime ) as $f 
| .[]
| select(
.created_at
| strptime("%FT%T.%Z")
| .[0] == $f[0] and .[1] == $f[1]
)

金桥玩

最新更新