文章目录
- mongodb简介
- mongodb存储
- mongodb概念
- mongodb数据结构
- mongodb连接
- mongodb命令
- 注意事项
mongodb简介
是一个基于分布式文件存储的数据库,c++编写,是为了web应用提供可扩展的高性能数据存储解决方案,在高负载的情况下,添加更多的节点,可以保证服务器性能
***
是介于关系型数据库和非关系型数据库之间,是非关系数据库中功能最全的,最像关系型数据库
mongodb存储
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
mongodb概念
MongoDB术语/概念 | 解释/说明 |
database | 数据库 |
collection | 数据库表/集合 |
document | 数据记录行/文档 |
field | 数据字段/域 |
index | 索引 |
表连接,MongoDB不支持 | |
primary key | 主键,MongoDB自动将_id字段设置为主键 |
MongoDB的默认数据库为"db",该数据库存储在data目录中
mongodb数据结构
数据类型 | 描述 |
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假) |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Array | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID,包含 12 bytes,值可以是任何类型的,默认是个 ObjectId 对象 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
mongodb连接
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
使用用户名fred,密码foobar登录localhost的admin数据库
mongodb://fred:foobar@localhost
使用用户名fred,密码foobar登录localhost的baz数据库。
mongodb://fred:foobar@localhost/baz
连接 replica set 三台服务器 (端口 27017, 27018, 和27019):
mongodb://localhost,localhost:27018,localhost:27019
连接 replica set 三台服务器, 写入操作应用在主服务器 并且分布查询到从服务器。
mongodb://host1,host2,host3/?slaveOk=true
x
以安全模式连接到replica set,并且等待至少两个复制服务器成功写入,超时时间设置为2秒。
mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000
分段 | 含义 |
mongodb:// | 这是固定的格式,必须要指定。 |
username:password@ | 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登录这个数据库 |
host1 | 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。 |
portX | 可选的指定端口,如果不填,默认为27017 |
/database | 如果指定username:password@,连接并验证登录指定数据库。若不指定,默认打开 test 数据库 |
?options | 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开 |
options选择
选项 | 描述 |
replicaSet=name | 验证replica set的名称。 Impliesconnect=replicaSet. |
slaveOk=true|false | 1. true:在connect=direct模式下,驱动会连接第一台机器,即使这台服务器不是主。在connect=replicaSet模式下,驱动会发送所有的写请求到主并且把读取操作分布在其他从服务器。 2. false: 在 connect=direct模式下,驱动会自动找寻主服务器. 在connect=replicaSet 模式下,驱动仅仅连接主服务器,并且所有的读写命令都连接到主服务器。 |
safe=true|false | 1. true: 在执行更新操作之后,驱动都会发送getLastError命令来确保更新成功。(还要参考 wtimeoutMS). 2. false: 在每次更新之后,驱动不会发送getLastError来确保更新成功 |
w=n | 驱动添加 { w : n } 到getLastError命令. 应用于safe=true。 |
wtimeoutMS=ms | 驱动添加 { wtimeout : ms } 到 getlasterror 命令. 应用于 safe=true. |
fsync=true|false | 1. true: 驱动添加 { fsync : true } 到 getlasterror 命令.应用于 safe=true. 2. false: 驱动不会添加到getLastError命令中。 |
mongodb命令
1. 显示所有数据的列表
show dbs
2. 查看已存在的集合
show collections
3. 显示当前数据库对象或集合
db
4. 连接到一个指定的数据库(如果数据库不存在,则创建数据库,否则切换到指定数据库)
use + 数据库名称
5. 创建数据库
use 数据库名称
6. 删除数据库
db.dropDatabase()
7. 删除集合
db.collection.drop()
8. 创建集合
db.createCollection(name, options)
例子:
db.createCollection("runoob")
创建固定集合 mycol,整个集合空间大小 6142800 B, 文档最大个数为 10000 个
db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000 }
9. 插入文档
db.COLLECTION_NAME.insert(document)
或
db.COLLECTION_NAME.save(document)
例子:
db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
10. 查看已经插入的文档
db.col.find()
11. 更新文档
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
11.1 query : update的查询条件,类似sql update查询内where后面的。
11.2 update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
11.3 upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
11.4 multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
11.5 writeConcern :可选,抛出异常的级别。
例子:
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
12. 删除文档
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
例子:
db.col.remove({'title':'MongoDB 教程'})
13. 查询文档
db.col.find().pretty()
例子:
db.col.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"}).pretty()
14. 条件操作符
想获取 "col" 集合中 "likes" 大于 100 的数据
db.col.find({likes : {$gt : 100}})()
相当于mysql: Select * from col where likes > 100;
想获取"col"集合中 "likes" 大于等于 100 的数据
db.col.find({likes : {$gte : 100}})
相当于mysql:Select * from col where likes >=100;
想获取"col"集合中 "likes" 小于 150 的数据
db.col.find({likes : {$lt : 150}})
相当于mysql: Select * from col where likes < 150;
想获取"col"集合中 "likes" 小于等于 150 的数据
想获取"col"集合中 "likes" 小于等于 150 的数据
相当于mysql: 想获取"col"集合中 "likes" 小于等于 150 的数据
想获取"col"集合中 "likes" 大于100,小于 200 的数据
db.col.find({likes : {$lt :200, $gt : 100}})
相当于mysql: Select * from col where likes>100 AND likes<200;
15. $type操作符
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
想获取 "col" 集合中 title 为 String 的数据
db.col.find({"title" : {$type : 2}})
或
db.col.find({"title" : {$type : 'string'}})
16. Limit与Skip方法
读取指定数量的数据记录
db.COLLECTION_NAME.find().limit(NUMBER)
例子:
db.col.find({},{"title":1,_id:0}).limit(2)
使用skip()方法来跳过指定数量的数据
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
17. 排序
sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列
db.COLLECTION_NAME.find().sort({KEY:1})
18. 索引
使用 createIndex() 方法来创建索引
db.collection.createIndex(keys, options)
db.col.createIndex({"title":1})
19. 聚合
聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。
有点类似 SQL 语句中的 count(*)。
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
例子:
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
表达式 | 描述 | 实例 |
$sum | 计算总和。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : {likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : {likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : {likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : {likes"}}}]) |
$push | 将值加入一个数组中,不会判断是否有重复的值。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : {url"}}}]) |
$addToSet | 将值加入一个数组中,会判断是否有重复的值,若相同的值在数组中已经存在了,则不加入。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : {url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", first_url : {url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", last_url : {url"}}}]) |
注意事项
1. 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
2.