mongo有很多的orm框架,例如mongoengine/pymongo/mongoalchemy/mongokit等,这些都各有利弊,不同的框架还有不同的封装好的更便捷的插件,我写过flask用的mongo封装的
flask-mongoengine。mongo 的具体详细操作,从下载到连接mongo再到创建库,集合,以及orm中的操作方法还有mongo服务中的操作方法,在官方文档上都是有详细解说,稍微有点点看不明白的就去单独问题搜一下其他人的博客解释,问题都不大,这里我就先不细细copy过来了。下面捡一个要紧的先记下来,这一点网上或者是官网没有针对性的说明,导致我可能是个人理解也有偏差,耽误了一些时间去排坑,这里记录一下。
不论用哪种框架,mongo的集合类型是固定的,这里需要先提一点,我遇到的mongo集合有两种,因为是第一次接触mongo,之前都是用mysql数据库用得比较多,所以熟悉一些,再接触其他的数据库都是跟mysql在做对比,主要逻辑是大同小异的,重点就是理解他们的差异性,各自优劣势,从而在以后的开发过程中能更合理的做出选择。
mongo的集合中我说的这两种就是capped collection以及非capped collection,他们的核心点就是,capped collection在创建之初就必须要指定集合的大小,而非capped collection则不需要。
原因是capped collection它内部是有一套类似于队列的机制,当该集合存储数据达到峰值,这个峰值就是我们一开始创建它的时候所设定的它的大小,它就会自动删除最开始存入的数据,从而给后续要存入的数据预留出来空间,就类似于队列的先进先出原则,这就是它的核心点。与此同时,capped collection是不支持删除集合中的部分数据的,也就是说这样的集合你创建了之后,如果想要要删除是不行的,如果要删除,只能把这个集合整个drop掉。除此之外没有其他办法。当然了,更改是可以的,不过,如果要该的话,必须要严格按照数据大小来更改,比如说要改这个集合demo的name字段的值,
db.demo.update({'name':'poter'},{$set:{'name':'brand'}})
这样是可以改的。但是如果这样就不行
db.demo.update({'name':'poter'},{$set:{'name':'brandy'}})
会报错:
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0, "writeError" : { "code" : 10003, "errmsg" : "Cannot change the size of a document in a capped collection: 38 != 39" } })
这里的报错信息中,“errmsg”说的很明白,你所更改的值跟原数据值大小不一致,没错,就是差一位数,单词从4个子变成5个字,就不行。这里不仅仅是改变一个字段的大小,这条数据创建了之后,它的大小就已经是定型的了,大小是按照字节数来决定的,你不论如何更改这条数据,是改字段名也好,改字段值也好,必须保持跟原来数据的大小一致,所以轻易不要改,不然还要算着字节数,太繁琐了,还不如直接重新创建一条数据。所以感受一下吧。
我个人感觉,可能是经验尚浅,还没有见过什么大世面,目前来看,最适合的应用场景就是做日志记录,这样比较符合它的特性,其他的还想不到什么应用场景。
如果要创建capped collection,就指定集合大小,具体参数,不同的orm不同的语法,只要加上指定集合大小的参数,那么它创建之后就是capped collection。
接下来说非capped collection集合类型特点,就是没有自动删除文件的牛逼功能,跟其他的数据库一样,自己对其进行增删改查操作。这里需要提醒的一点是,如果你要创建非capped collection,那么在创建的时候不要加上类似:‘capped’,‘max ducument’,‘max size’,‘size’这样的表示大小的参数值就可以了。
简单来说就是不要指定集合大小!不要指定集合大小!不要指定集合大小!
一旦你指定了改集合的大小,它即是capped collection类型。
mongoengine的参数配置,全面版
from flask import Flask from flask_mongoengine import MongoEngine app = Flask(__name__) app.config['MONGODB_SETTINGS'] = { 'db': 'app_db', 'host': 'localhost', 'port': 27017, 'username': 'appUser', 'password': 'passwordForAppUser', 'authentication_source': 'admin' } db = MongoEngine(app)
如果涉及到权限问题就用上面这些参数,把它们都配置齐全。
这里是数据批量导入到mongo里面的命令
mongorestore -d tank /home/zhangy/mongodb/tank/
mongorestore 是命令操作
-d tank 是指定数据库,如果没有这个库则自动生成此库,比较方便
/home/zhangy/mongodb/tank/ 是所存放的数据文件路径,就是把这个路径下的所有文件都导入到数据库中,前提是这些文件都是从数据库中导出的才可以,有固定的生成格式,不能随意来