mongo 与MySQL的简单概念对比
MongoDB 以 BSON 结构(二进制)进行存储
MongoDB 的所有数据实际上是存放在硬盘的,所有要操作的数据通过 mmap 的方式映射到内存某个区域内
,
MongoDB 在内存中修改了数据后,mmap 数据flush到硬盘之前,系统宕机了,数据就会丢失。
存储方式:虚拟内存+持久化
mmap 系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用。 read(),write()等操作。
mmap 并不分配空间, 只是将文件映射到调用进程的地址空间里, 然后你就可以用 memcpy 等操作写文件, 而不用 write() 了.写完后用 msync() 同步一下, 你所写的内容就保存到文件里了. 不过这种方式没办法增加文件的长度, 因为要映射的长度在调用 mmap() 的时候就决定了。
mongo | mysql |
---|---|
数据库 | 数据库 |
表 | 集合 |
文档 | 行(记录) |
数据库操作
- 使用数据库mongo_demo,如果不存在则创建数据库
use mongo_demo
db.mongo_demo.insert({"name":"suvii","age":22})
创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建
下面的db,其实都可以理解为当前数据库的一个实例
- 查看当前数据库:
db
- 查看所有数据库:
show dbs
删除数据库
db.dropDatabase() 删除当前数据库,默认为test
集合操作:
- 创建集合:
创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )
也可无需创建集合,在插入文档时会自动创建指定集合:
db.log.insert({"name":"科比","what":"起床训练","where":"洛杉矶","when":"凌晨4点"})
- 删除集合:
db.collectionName.drop()
文档操作
所有文档的数据结构基本和json一样,存储在集合中的数据都是BSON (Binary JSON)
- 插入文档
log 是集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。
db.COLLECTION_NAME.insert(document)
db.log.insert({"name":"科比","what":"起床训练","where":"洛杉矶","when":"凌晨4点"})
- 查看已插入文档:
db.log.find()
- 更新文档
db.log.save(
<document>,
{
writeConcern: <document> //可选,抛出异常的级别。
}
)
如果指定 _id字段,save方法会更新指定_id文档,否则为新增文档
db.collection.update(
<query>, //update的查询条件,类似sql update查询内where后面的。
<update>, // update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
{
upsert: <boolean>, //可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi: <boolean>, //可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新
writeConcern: <document> //可选,抛出异常的级别。
}
)
db.log.update({"name":'科比'},{$set:{'what':'训练变强'}})
db.log.update({"name":'科比'},{$set:{'what':'训练变强'},{multi:true}}) //设置 multi 参数为 true,会修改多条匹配到的数据
- 删除文档
db.log.deleteOne({'name':'bob'}) //删除匹配的一个文档
db.log.deleteMany({'name':'bob'}) //删除匹配的全部文档
db.log.remove({}) //删除所有文档
- 查询文档
db.collection.find(query, projection) , projection指定返回的键名
db.log.find({'price':{$lt:168} }) //$gt:大于, $lte:<=小于或等于 $ne:不等于
db.log.find({'price':{$lt:168}, 'name':'洗衣粉'}) //,分开 相当于and条件
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
) //OR条件
db.collection.find({}, {name: 1, age: 1}) //筛选显示的键
db.log.find({time:/凌晨/}) //模糊查询 when包含‘凌晨’的
db.log.find({when:/^凌晨/}) //模糊查询 when包含‘凌晨’开头的
db.log.find({when:/凌晨$/}) //模糊查询 when包含‘凌晨’结尾的
db.log.find({'price':{$lt:168}).limit(10).sort({age:1}) //sort排序,1 --> 升序, -1 --> 降序
索引
待更新…