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]
)
金桥玩