【发布时间】:2018-02-12 16:02:08
【问题描述】:
抱歉,如果这是一个新手问题。我对 perl 很陌生。
我从包含查询的数据库中读取了一系列字符串,其中一些用于 mongodb 并且采用 json 格式(松散)。
我正在尝试通过修改现有的 perl 脚本来读取这些字符串并在适当的数据库上运行它们,该脚本对 MySQL 查询执行非常相似的操作。
即读取json字符串,解码成数组,然后在mongodb中运行。
简单的案例工作正常。 问题是某些数据类型(例如 ISODate)需要在运行查询之前转换为 perl 对象。例如:
my $qstr = 'MONGOQUERY[
{
$match: {
"lastModifiedDate": "ISODate("2016-08-10T04:55:46.053+0000")"
}
},
{
$project: {
name:1
}
},
]';
$qstr=~s/MONGOQUERY//gs;
my $qarrayref = JSON::PP->new->allow_nonref->relaxed->allow_barekey->loose->decode($qstr);
my $mongores = $collection->aggregate( $qarrayref,{ allowDiskUse => 1 } );
我的解决方法是在运行查询之前用适当的匹配 perl 对象查找并替换数组中那些指定数据类型(Timestamp、ISODate、NumberDecimal、NumberLong、NumberInt、Symbol)的所有实例,但因为数组不一定一致的深度,我不知道该怎么做。有什么想法或替代解决方法吗?
并不是说它会更好,但请注意,如果我删除引号并有:
"lastModifiedDate": ISODate("2016-08-10T04:55:46.053+0000")
json 解码部分甚至不起作用。
【问题讨论】:
-
为什么不能简单地将值作为字符串传递? IIRC 的 ISODate 函数应该是 MongoDB 理解的吧?
-
我试过了,但是当我使用时:"lastModifiedDate":"ISODate("2016-08-10T04:55:46.053+0000")" 似乎试图将它与字符串进行比较"ISODate("2016-08-10T04:55:46.053+0000")" 而不是实际日期。如果这可行,那将是理想的,但如以下链接所示,它不stackoverflow.com/questions/23709428/query-isodate-time-in-perl
-
即使您使用标量引用?如
\qq{ISODate(2016-08-10T04:55:46.053+0000")}? -
ISODate() 是 shell 中 Javascript 中的辅助函数。它不被数据库解析。对于 Perl,您需要创建一个受支持的日期时间对象:请参阅 MongoDB::DataTypes
-
@xdg,我认为是这种情况(尽管我希望有一个替代方案),但是我如何遍历数组以用新的日期时间对象替换 ISODate 的每个实例?你能提供一个示例代码吗?