暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mongoexport带过滤条件导出

IT那活儿 2022-05-10
2251
点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!


mongodb数据库
mongodb跟其他数据库产品一样,提供了数据导出工具,包含导出bson文件的mongodump和导出json/csv的mongoexport,并且都支持带过滤条件导出数据。


CSV数据报错
某日,接客户反馈使用Mongoexport导出CSV数据报错,如下图:
导出命令是:
mongoexport -u root --authenticationDatabase=admin -d c***prod -c Vr***foDO --type=csv -f contentId,to**me,createdTim,t**idDa -q '{$and:[{ $or: [ {contentId:{ $regex:/^6009266/}}, {contentId:{ $regex:/^6009261/}} ]} ,{createdTime : {$gte : new Date(1610553655000)}} ]}'  -o home/mongo/t**id_20220210.csv
看到报错信息,我首先想到的就是查询子句写错了,但是当我将子查询放到数据库里面查询时并没有报错。
此时,我一脸懵逼,仔细检查了符号之类的也没有问题。问了度娘,基本上所有的说法都是什么加双引号转义之类的,一一尝试之后报错依旧。
通过仔细查询官方文档,发现如下提示:
Extend JSON是什么鬼?为什么以前使用query条件导出时没有报错呢 ??接着往下看。
如下图所述,从4.2版开始,mongoexport等工具必须遵循Extended JSON 2.0。
当前我们操作的数据库版本确实是新装不久的4.2版,所以子查询必须是要经扩展JSON。


什么是扩展JSON
  1. Extend JSON包含规范扩展JSON和宽松扩展JSON两种格式,但是不论哪种格式,JSON文档中的所有字符串都应有双引号,而Mongodb的增删改查的格式也是个json,所以也应用双引号包起来。
  2. 在规范的扩展JSON中,每一个数值都必须包含其字段类型,如时间数据必须是{"$date": {"$numberLong": "1610553655000"}},长整型数据 {"$numberLong": 50}。
下图摘自官方文档
是扩展JSON两种格式各类型数据的数据格式:

所以,综上分析,修改本例导出命令的子查询为:
{"$and":[{ "$or": [ {"contentId":{ "$regex":"^6009266"}}, {"contentId":{ "$regex":"^6009261"}} ]},{"createdTime" : {"$gte" : {"$date": {"$numberLong": "1610553655000"}}}} ]}

END



本文作者:刘运彬

本文来源:IT那活儿(上海新炬王翦团队)

​​
文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论