基本概念
| SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
|---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
| # | RDBMS | MongoDB |
|---|---|---|
| 服务端 | Mysqld/Oracle | mongod |
| 客户端 | mysql/sqlplus | mongo |
- 隐式创建数据库和集合
NoSql:not only sql 非关系型数据库
- 面向对象式的
新浪微博:redis
google:bigtable
amazon:simpledb
淘宝:tair
视觉网站:mongodb
优酷运营数据分析:mongodb
飞信空间:handlersocket
豆瓣社区:beansdb- 优点:
简单的扩展
快速的读写
低廉的成本
灵活的数据模型 - 缺点:
只是在局部展现出某些优势
不提供对sql的支持
支持的特性不够丰富
- 优点:
现有的产品不够成熟相对成熟的产品
mongodb,redis是一个面向集合的,模式自由的文档型数据库
- 面向集合:
- 文件存储格式:
bson(二进制的json) - 使用场景:
持久化的缓存层
高效的实时性
用于对象以及json数据的存储
高伸缩性的场景
大尺寸,低价值的数据存储 - 不适用:
高度事务
传统的商业智能应用
复杂的多表查询
- 文件存储格式:
查询
MongoDB 查询数据的语法格式如下:
db.collection.find(query, projection)
query:可选,使用查询操作符指定查询条件projection:可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用pretty()方法,语法格式如下:
db.col.find().pretty()
返回当前集合数据项的总条数
db.col.find().count()
若不指定 projection,则默认返回所有键,指定 projection 格式如下,有两种模式
db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的键,不返回其他键
db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的键,返回其他键
_id 键默认返回,需要主动指定 _id:0 才会隐藏
两种模式不可混用(因为这样的话无法推断其他键是否应返回)
db.collection.find(query, {title: 1, by: 0}) // 错误
只能全1或全0,除了在inclusion模式时可以指定_id为0
db.collection.find(query, {_id:0, title: 1, by: 1}) // 正确
排序
在MongoDB中使用使用sort()方法对数据进行排序。
sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
Limit与Skip
limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。skip方法同样接受一个数字参数作为跳过的记录条数。skip和limit结合就能实现分页。- 当查询时同时使用
sort,skip,limit,无论位置先后,最先执行顺序sort再skip再limit。 skip和limit方法只适合小数据量分页,如果是百万级效率就会非常低,因为skip方法是一条条数据数过去的,建议使用where_limit。
SQL分页的后一种时间戳分页方案,这种利用字段的有序性质,利用查询来取数据的方式,可以直接避免掉了大量的数数。也就是说,如果能附带上这样的条件那查询效率就会提高。
这里我们假设查询第100001条数据,这条数据的Amount值是:2399927,我们来写两条语句分别如下:
b.test.sort({"amount":1}).skip(100000).limit(10) //183ms
db.test.find({amount:{$gt:2399927}}).sort({"amount":1}).limit(10) //53ms
实验结果印证了Skip效率差的理论。
更新
update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:
query : update的查询条件,类似sql update查询内where后面的。update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的upsert: 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。multi: 可选,mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。writeConcern:可选,抛出异常的级别。
当不使用$set操作符时,update()第二个对象将全部覆盖第一个对象(不包括_id)
// {"_id":2,"x":1,"y":33,"z":98}
update({x:1},{y:3})
这样新的集合将会变为{"_id":2,"y":3}
删除
删除文档
remove() 方法已经过时了,现在官方推荐使用 deleteOne() 和 deleteMany() 方法。
- 如删除集合下全部文档:
db.inventory.deleteMany({})
- 删除 status 等于 A 的全部文档:
db.inventory.deleteMany({ status : "A" })
- 删除 status 等于 D 的一个文档:
db.inventory.deleteOne( { status: "D" } )
删除集合
db.collection.drop()
删除数据库
db.dropDatabase()
显示
显示数据库
show dbs
显示集合
show tables
show collections
插入
插入文档你也可以使用 db.col.save(document)命令。如果不指定_id字段 save() 方法类似于insert()方法。如果指定_id字段,则会更新该_id的数据。
3.2 版本后还有以下几种语法可用于插入文档:
db.collection.insertOne():向指定集合中插入一条文档数据db.collection.insertMany():向指定集合中插入多条文档数据
// 插入单条数据
> var document = db.collection.insertOne({"a": 3})
> document
{
"acknowledged" : true,
"insertedId" : ObjectId("571a218011a82a1d94c02333")
}
// 插入多条数据
> var res = db.collection.insertMany([{"b": 3}, {'c': 4}])
> res
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("571a22a911a82a1d94c02337"),
ObjectId("571a22a911a82a1d94c02338")
]
}
- 使用js语法插入多条数据:
for(i=2;i<100;i++)db.test01_collection.insert({x:i})
2781

被折叠的 条评论
为什么被折叠?



