利用MongoEnigine避免脏数据的产生
脏数据产生原因
- 常规mongo插入数据,无法校验类型,导致存入的数据和预期的数据类型有差异,且容易忽略此类问题(比如date类型)
- dumpfile可能产生脏数据
- 插入重复的字段,产生多余脏数据
- 插入多余字段
利用mongoengine校验数据
-
mongoegine可以很好的避免以上问题的出现,减少脏数据产生的可能性
-
唯一性约束
MongoEngine允许你通过提供unique=True给Field构造函数来指定一个字段在集合中是唯一的。如果您尝试将与唯一字段具有相同值的文档保存为数据库的文档, NotUniqueError则会引发。您也可以使用下列方法指定多字段唯一性约束:unique_with可以是单个字段名称,也可以是字段名称的列表或元组class User(Document): username = StringField(unique=True) first_name = StringField() last_name = StringField(unique_with='first_name')
-
可以利用文档类型,控制是可以添加新字段
动态文档(Dynamic Document)跟非动态文档(document)的区别是,动态文档可以在模型基础上新增字段,但非动态文档不允许新增。class ExampleFirst(Document): # 默认是一个空列表 values = ListField(IntField(), default=list) class Page(DynamicDocument): title = StringField(max_length=200, required=True)
mongoenigine使用注意点
-
mongo可以识别的date类型格式为一下格式,注意在python中,datetime类型通过pymongo存入会被解析为一个date类型
db.test.insertOne( { ts: new Timestamp() } ); var mydate1 = new Date(); var mydate2 = ISODate();
mongoexport和mongoimport注意点
-
mongoexport
table=topic mongoexport \\ --host 111.231.92.176 --port 29032 \\ --username "spider" --db spider \\ --password "spider.1qaz@WSX" \\ --collection topic \\ -f _id,create_at,type,name, --type=csv \\ --out ./topic.csv --forceTableScan
-
mongoimport
mongoimport \\ -h 111.231.92.176:29032 -d spider\\ -u spider -p spider.1qaz@WSX \\ --authenticationDatabase spider \\ -c new_topic \\ --type csv --headerline \\ --file ./topic.csv
-
为了保证无损import json到数据库,需要注意json中特定类型的格式(比如日期类型,要写成new Data()或者new timestamp()。。。)
mongoenigine知识点
- 定义类型为int,插入str类型,不会报错,且插入的数据为str类型
- 定义类型为int,插入double类型,会被转为int类型,同理定义double,插入int,会转为double
- 插入值为None的数据,会被删掉,无法存入数据库
- 存入空字符(忘了,待验证)
总结:存入与定义类型不相符的字段,可以转换的就转换,无法转换的保留存入的类型,空值,过滤掉,(这里忘了,定义date类型,存入字符串会怎样?待验证)
参考:https://blog.csdn.net/xinxianren007/article/details/100183982
一个人可以被毁灭,但不能被打败