mongodb官方文档总结
- MongoDB是非关系型数据库。
- BASE是NoSQL数据库通常对可用性及一致性的弱要求原则:
- Basically Availble --基本可用
- Soft-state --软状态/柔性事务。 "Soft state" 可以理解为"无连接"的, 而 "Hard state" 是"面向连接"的
- Eventual Consistency --最终一致性 最终一致性, 也是是 ACID 的最终目的。
概念对照
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
这些定义看起来有点像是es中的定义。
- 文档中的键值对是有序的。
- 文档中的键是字符串。
- 集合是mongoDb的 文档组,就像是table。但是没有固定的格式,任意格式和类型的数据都可以插入。
- Capped collections 就是固定大小的collection。它有很高的性能以及队列过期的特性(过期按照插入的顺序). 有点和 "RRD" 概念类似。
数据类型
数据类型 | 描述 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Arrays | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
- 在一个集合里面,每个文档都有唯一的"_id"值,来确保集合里面每个文档都能被唯一标识。考虑到多个服务器,所以并不是使用自增的方式。用newObjectId = ObjectId() 生成
- MongoDB支持全文检索,(不过全文检索这方面还是es靠谱)
- MongoDB支持正则表达式查询。
- 固定集合插入速度,按照插入顺序查询极快,并且能自动删除老数据。
基本命令
代码语言:javascript复制use DATABASE_NAME
创建数据库,如果已有,进入该数据库进行操作
代码语言:javascript复制db.createCollection("cappedLogCollection",{capped:true,size:10000,max:1000})
创建固定集合
代码语言:javascript复制show dbs
展示所有数据库,但是没有数据的数据库将不会展示
代码语言:javascript复制db.dropDatabase()
删除当前数据库
代码语言:javascript复制db.collection.drop()
删除当前数据库的集合
代码语言:javascript复制db.COLLECTION_NAME.insert(document)
eg:db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'MongoDB中文网',
url: 'http://www.mongodb.org.cn',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
还可以将数据定义成变量之后插入数据:
document=({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'Mongodb中文网',
url: 'http://www.mongodb.org.cn',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
db.col.insert(document)
往一个集合里面添加数据。
代码语言:javascript复制db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
eg:db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 输出信息
修改数据
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如,inc...)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
eg:db.col.save({
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "MongoDB中文网",
"url" : "http://www.mongodb.org.cn",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
}
)//替换了_id 为 56064f89ade2f21f36b03136 的文档数据
传入的文档来替换已有的数据
代码语言:javascript复制db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
eg:db.col.remove({'title':'MongoDB 教程'})
db.col.remove({}) //删除所有数据
参数说明:
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档。
- writeConcern :(可选)抛出异常的级别。
db.COLLECTION_NAME.find()//全部
db.col.find().pretty() // 易读方式
db.col.findOne()//只查一个
Where
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {:} | db.col.find({"by":"菜鸟教程"}).pretty() | where by = '菜鸟教程' |
小于 | {:{$lt:}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {:{$lte:}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | {:{$gt:}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {:{$gte:}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {:{$ne:}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
eg:db.col.find({likes : {
gt : 100}})
代码语言:javascript复制db.col.find({key1:value1, key2:value2}).pretty()
and查询
代码语言:javascript复制db.col.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
eg:db.col.find({"likes": {$gt:50}, $or: [{"by": "Mongodb中文网"},{"title": "MongoDB 教程"}]}).pretty() //and,or联合使用
or查询
Type
利用type可查询某一文档中的某一数据为特定的数据类型:
代码语言:javascript复制db.col.find({"title" : {$type : 2}})
limit和skip
代码语言:javascript复制db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
查询前几条,跳过前几条,类似于limit ?,?
sort
代码语言:javascript复制db.COLLECTION_NAME.find().sort({KEY:1})
eg:db.col.find({},{"title":1,_id:0}).sort({"likes":-1}) //按照like倒序排序
使用 1 和 -1 来指定排序的方式
索引
MongoDB使用 ensureIndex() 方法来创建索引。
代码语言:javascript复制db.COLLECTION_NAME.ensureIndex({KEY:1})
eg:db.col.ensureIndex({"title":1})//创建title升序索引
db.col.ensureIndex({"title":1,"description":-1})//复合索引
db.values.ensureIndex({open: 1, close: 1}, {background: true}) //后台创建索引
可选参数:
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。 |
unique | Boolean | 建立的索引是否唯一。指定为true创建唯一索引。默认值为false. |
name | string | 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 |
dropDups | Boolean | 在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false. |
sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false. |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
v | index version | 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. |
索引是存储在内存中的,由于索引是存储在内存(RAM)中,你应该确保该索引的大小不超过内存的限制。
如果索引的大小大于内存的限制,MongoDB会删除一些索引,这将导致性能下降。
索引不能被以下的查询使用:
- 正则表达式及非操作符,如
not, 等。
- 算术运算符,如 $mod, 等。
- $where 子句
所以,检测你的语句是否使用索引是一个好的习惯,可以用explain来查看。