mongo

 

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/ 是所存放的数据文件路径,就是把这个路径下的所有文件都导入到数据库中,前提是这些文件都是从数据库中导出的才可以,有固定的生成格式,不能随意来

 

posted @ 2018-06-23 12:06  dream-子皿  阅读(172)  评论(0编辑  收藏  举报