十分钟了解MongoDB
今天写写 MongoDB的事情。这货是一个document-orientied, 基本上使用的json进行交互的。他把那个形式很像json的东西叫做 BJSON. 里面有一些mongoDB自己定义的数据类型。这种数据形式在传输存储很方便。
首先介绍一下MongoDB的数据结构
database : 这个和mysql中的database一致。 默认使用的local, 可以自己创建新的。例如 在shell中写 db.xxx 然后就自动创建了xxx 这个collection
collection: 这个概念和mysql中的table保持一致。
document: 这个和mysql里的row或者 record保持一致。
这个是MongoDB的三个最主要的结构。
下面是如何使用。
下载安装
首先去 www.mongoDB.org 上下载一个mongoDB的最新版。然后解压到某个目录。然后使用命令行进入到该目录下。
创建 数据存储文件夹,这里可以直接创建一个 /data/db的文件夹(mkdir -p /data/db)。然后在命令行里执行如下命令启动mongodb server.
mongod --dbpath ./data/db这样mongoDB就启动了,一般端口为 27017. 你可以使用help来修改Port等。这里就不过多介绍。
然后重新开一个命令窗口,使用命令进入到该目录下,执行下面语句启动mongoDB client.
mongo
如果使用的都是默认端口,这里就可以正常启动了。如果你修改了mongoDB server的端口,这里需要改成一致的。
数据库CRUD(Create, Retrieve, Update, Delete)操作
下面就是命令行选择database, 创建collection, 存储document。首先:
db 查看需要现有的database. show dbs 使用ooo作为database use ooo; 如果这里不写use ooo,那默认就是local.
然后是数据库的操作了:
1. 插入
var a = {"value":1,"value2":[‘a‘,‘b‘]} var b = {"value":2} var c = {"str":‘aaa’} 插入数据,xxxx是collection db.xxxx.save(a); 下面也是插入数据 db.xxxx.insert(b); db.xxxx.insert(c);
2. 查看数据
获取全部数据 db.xxxx.find() 获取一个数据 db.xxxx.findOne() 查询特定的记录 db.xxxx.find({"value":1})
3.更新操作
db.xxxx.update( { value: { $lt: 18 } }, { $set: { status: "A" } }, { multi: true } ) 这里 { value: { $lt: 18 } },是说 value < 18, { $set: { status: "A" } },是说要set status 为A, 如果没有那个域,则创建出来。 { multi: true } 则是处理多个。
4. 删除操作
db.xxxx.remove({"value":1}) 删除value 为1 的document.
这里看起来非常简单。
结束语
MongoDB的强大之处在于 JSON串里想写什么就可以写什么。 相同的collection中document可以完全不相同。(但是为了后期的维护,还是尽量相同。)这是稀疏数据库的一大优势。
建索引MongoDB有很多种,可以建立unique 索引, TTL 索引(数据会过期失效,默认为此索引), 多列组合索引,空间索引,全文索引和hash索引。这里的多列索引和mysql的一致。对于全文索引,mongoDB建议不要在生产环境(线上环境)中使用,因为这个建索引很慢,性价比不高。
对于mongoDB来说,他的索引可以使用{"backgroup":true}来进行后台异步创建,也可以使用前台索引。但是前台索引会对性能造成极大的影响,所以mongoDB官方文档建议新起一个mongoDB server的实例进行创建。然后使用副本启动的方法将创建好的索引作为副本启动。
对于mongoDB,安全性做的比较粗略。也是对于操作,对于database等特殊数据需要分配权限。因为没有视图等概念,这些安全性做的比mysql来说粒度大了一些。但是mongoDB支持SSL 方式访问,也支持kerberos认证。不过Kerberos认证现在只有微软那边在用,之前K3,K4被破,人心惶惶。现在不知道情况如何。
今天就先介绍这么多吧。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。