mongodb 基础知识
2016-08-19 17:26
465 查看
mongodb 基础知识
运行环境CentOS Linux release 7.2.1511 (Core)
安装
wget
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.9.tgz
tar -zxvf mongodb-linux-x86_64-rhel70-3.2.9.tgz
mv mongodb-linux-x86_64-rhel70-3.2.9 /usr/local/mongodb
添加到环境变量
vi ~/.bashrc
加入:
export PATH=/usr/local/mongodb/bin:$PATH
使环境变量生效
source ~/.bashrc
启动
启动前先创建数据库默认存储路径,否则会报错。
mkdir -p /data/db
[root@localhost bin]# mongod 2016-08-19T22:14:07.426+0800 I CONTROL [initandlisten] MongoDB starting : pid=6611 port=27017 dbpath=/data/db 64-bit host=localhost.localdomain 2016-08-19T22:14:07.427+0800 I CONTROL [initandlisten] db version v3.2.9 2016-08-19T22:14:07.427+0800 I CONTROL [initandlisten] git version: 22ec9e93b40c85fc7cae7d56e7d6a02fd811088c 2016-08-19T22:14:07.427+0800 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013 2016-08-19T22:14:07.428+0800 I CONTROL [initandlisten] allocator: tcmalloc 2016-08-19T22:14:07.428+0800 I CONTROL [initandlisten] modules: none 2016-08-19T22:14:07.428+0800 I CONTROL [initandlisten] build environment: 2016-08-19T22:14:07.428+0800 I CONTROL [initandlisten] distmod: rhel70 2016-08-19T22:14:07.429+0800 I CONTROL [initandlisten] distarch: x86_64 2016-08-19T22:14:07.429+0800 I CONTROL [initandlisten] target_arch: x86_64 2016-08-19T22:14:07.429+0800 I CONTROL [initandlisten] options: {} 2016-08-19T22:14:07.470+0800 I STORAGE [initandlisten] exception in initAndListen: 29 Data directory /data/db not found., terminating 2016-08-19T22:14:07.471+0800 I CONTROL [initandlisten] dbexit: rc: 100 [root@localhost bin]# mkdir -p /data/db
启动:
mongod
概念区分
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
MongoDB的默认数据库为"db",该数据库存储在data目录中
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
显示所有数据的列表(数据库为空时不显示):
show dbs
连接数据库
mongo或
mongodb://username:password@IP/
显示当前数据库和集合
db
链接或创建数据库
use dbname
删除数据库
use 数据库名 db.dropDatabase()
实例:
> use testdb switched to db testdb > db.dropDatabase() { "dropped" : "testdb", "ok" : 1 } >
文档(表、集合)
插入数据db.集合名称.insert()或
db.集合名称.save()
db.集合名称.insert({"name":"database name"})
删除集合
db.集合名称.drop()
查询数据(pretty() 方法以格式化的方式来显示所有文档。)
db.集合名称.find()
db.集合名称.find().pretty()
操作符
操作 | 格式 | 例子 |
---|---|---|
等于 | {key : value} | db.col.find({"name":"title"}).pretty() |
小于 | {key:{$lt : value}} | db.col.find({"likes":{$lt:50}}).pretty() |
小于等于 | {key:{$lte : value}} | db.col.find({"likes":{$lte:50}}).pretty() |
大于 | {key:{$gt: value}} | db.col.find({"likes":{$gt:50}}).pretty() |
大于等于 | {key:{$gte: value}} | db.col.find({"likes":{$gte:50}}).pretty() |
不等于 | {key:{$ne: value}} | db.col.find({"likes":{$ne:50}}).pretty() |
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,及常规 SQL 的 AND 条件。
语法格式如下:
>db.col.find({key1:value1, key2:value2}).pretty()
> db.col.insert({name:"name", value:"value"}) WriteResult({ "nInserted" : 1 }) > db.col.find({name:"name", value:"value"}) { "_id" : ObjectId("57b72c84e046f1574e641799"), "name" : "name", "value" : "value" }
OR 条件
使用关键字$or
>db.col.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
> db.col.find() { "_id" : ObjectId("57b725e6e046f1574e641797"), "name" : "update title2" } { "_id" : ObjectId("57b72c84e046f1574e641799"), "name" : "name", "value" : "value" } { "_id" : ObjectId("57b72ce7e046f1574e64179a"), "name" : "testname", "value" : "test" } > > db.col.find({$or:[{name:"name"}, {value:"test"}]}) { "_id" : ObjectId("57b72c84e046f1574e641799"), "name" : "name", "value" : "value" } { "_id" : ObjectId("57b72ce7e046f1574e64179a"), "name" : "testname", "value" : "test" } >
AND 和 OR 联合使用
> db.col.find() { "_id" : ObjectId("57b725e6e046f1574e641797"), "name" : "update title2" } { "_id" : ObjectId("57b72c84e046f1574e641799"), "name" : "name", "value" : "value" } { "_id" : ObjectId("57b72ce7e046f1574e64179a"), "name" : "testname", "value" : "test" } { "_id" : ObjectId("57b72e50e046f1574e64179b"), "name" : "name", "value" : "test", "number" : 100 } { "_id" : ObjectId("57b72e6de046f1574e64179c"), "name" : "name", "value" : "test", "number" : 200 } { "_id" : ObjectId("57b72e70e046f1574e64179d"), "name" : "name", "value" : "test", "number" : 100 } > > > db.col.find({number: {$eq : 100}, $or : [{name:"name"}, {value:"test"}]}) { "_id" : ObjectId("57b72e50e046f1574e64179b"), "name" : "name", "value" : "test", "number" : 100 } { "_id" : ObjectId("57b72e70e046f1574e64179d"), "name" : "name", "value" : "test", "number" : 100 } >
$type 操作符
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
limit和skip的用法
limit限制返回的条数
skip跳过指定数量的数据
> db.col.find(); { "_id" : ObjectId("57b725e6e046f1574e641797"), "name" : "update title2" } { "_id" : ObjectId("57b72c84e046f1574e641799"), "name" : "name", "value" : "value" } { "_id" : ObjectId("57b72ce7e046f1574e64179a"), "name" : "testname", "value" : "test" } { "_id" : ObjectId("57b72e50e046f1574e64179b"), "name" : "name", "value" : "test", "number" : 100 } { "_id" : ObjectId("57b72e6de046f1574e64179c"), "name" : "name", "value" : "test", "number" : 200 } { "_id" : ObjectId("57b72e70e046f1574e64179d"), "name" : "name", "value" : "test", "number" : 100 } > > db.col.find().limit(2) { "_id" : ObjectId("57b725e6e046f1574e641797"), "name" : "update title2" } { "_id" : ObjectId("57b72c84e046f1574e641799"), "name" : "name", "value" : "value" } > > db.col.find().limit(2).skip(2) { "_id" : ObjectId("57b72ce7e046f1574e64179a"), "name" : "testname", "value" : "test" } { "_id" : ObjectId("57b72e50e046f1574e64179b"), "name" : "name", "value" : "test", "number" : 100 }
文档排序
使用
sort()方法并通过参数指定排序的字段,并使用
1和
-1来指定排序的方式,其中
1为
升序排列,而
-1是用于
降序排列。
格式:
db.集合名称.find().sort({KEY:1})
> db.col.find() { "_id" : ObjectId("57b725e6e046f1574e641797"), "name" : "update title2" } { "_id" : ObjectId("57b72c84e046f1574e641799"), "name" : "name", "value" : "value" } { "_id" : ObjectId("57b72ce7e046f1574e64179a"), "name" : "testname", "value" : "test" } { "_id" : ObjectId("57b72e50e046f1574e64179b"), "name" : "name", "value" : "test", "number" : 100 } { "_id" : ObjectId("57b72e6de046f1574e64179c"), "name" : "name", "value" : "test", "number" : 200 } { "_id" : ObjectId("57b72e70e046f1574e64179d"), "name" : "name", "value" : "test", "number" : 100 } > > db.col.find().sort({name:1}) { "_id" : ObjectId("57b72c84e046f1574e641799"), "name" : "name", "value" : "value" } { "_id" : ObjectId("57b72e50e046f1574e64179b"), "name" : "name", "value" : "test", "number" : 100 } { "_id" : ObjectId("57b72e6de046f1574e64179c"), "name" : "name", "value" : "test", "number" : 200 } { "_id" : ObjectId("57b72e70e046f1574e64179d"), "name" : "name", "value" : "test", "number" : 100 } { "_id" : ObjectId("57b72ce7e046f1574e64179a"), "name" : "testname", "value" : "test" } { "_id" : ObjectId("57b725e6e046f1574e641797"), "name" : "update title2" } > > db.col.find().sort({name:-1}) { "_id" : ObjectId("57b725e6e046f1574e641797"), "name" : "update title2" } { "_id" : ObjectId("57b72ce7e046f1574e64179a"), "name" : "testname", "value" : "test" } { "_id" : ObjectId("57b72c84e046f1574e641799"), "name" : "name", "value" : "value" } { "_id" : ObjectId("57b72e50e046f1574e64179b"), "name" : "name", "value" : "test", "number" : 100 } { "_id" : ObjectId("57b72e6de046f1574e64179c"), "name" : "name", "value" : "test", "number" : 200 } { "_id" : ObjectId("57b72e70e046f1574e64179d"), "name" : "name", "value" : "test", "number" : 100 } >
更新文档(
update或者
save来更新文档)
update方式
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如
$set,
$inc...)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb
默认是false,
只更新找到的第一条记录,如果这个参数为
true,就把按条件
查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
例子:
> db.col.find() > > > db.col.insert({"name" : "value"}) WriteResult({ "nInserted" : 1 }) > db.col.insert({"name" : "title"}) WriteResult({ "nInserted" : 1 }) > db.col.find() { "_id" : ObjectId("57b725e6e046f1574e641797"), "name" : "value" } { "_id" : ObjectId("57b725eee046f1574e641798"), "name" : "title" } > db.col.update({"name" : "title"}, {$set:{"name" : "update title"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.col.find() { "_id" : ObjectId("57b725e6e046f1574e641797"), "name" : "value" } { "_id" : ObjectId("57b725eee046f1574e641798"), "name" : "update title" } >
save方式
save() 方法 save() 方法通过传入的文档来替换已有文档。语法格式如下: db.collection.save( <document>, { writeConcern: <document> } )
参数说明:
document : 文档数据。
writeConcern :可选,抛出异常的级别。
删除文档
db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )
参数说明:
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档。
writeConcern :(可选)抛出异常的级别。
> db.col.remove({name:"update title"}) WriteResult({ "nRemoved" : 1 })
如果想清空表(truncate)
db.col.remove({})
索引
使用ensureIndex()方法来创建索引
db.集合名称.ensureIndex({KEY:1})
升序:1,降序:-1
参数 | 参数值类型 | 描述 |
---|---|---|
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. |
聚合统计
主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的count(*)
语法
db.集合名称.aggregate(AGGREGATE_OPERATION)
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和。 | db.mycol.aggregate([{$group : {_id : "$聚合字段", num_tutorial : {$sum : "$统计字段"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : "$聚合字段", num_tutorial : {$avg : "$likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{$group : {_id : "$聚合字段", num_tutorial : {$min : "$统计字段"}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{$group : {_id : "$聚合字段", num_tutorial : {$max : "$统计字段"}}}]) |
$push | 在结果文档中插入值到一个数组中。 | db.mycol.aggregate([{$group : {_id : "$聚合字段", url : {$push: "$统计字段"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本。 | db.mycol.aggregate([{$group : {_id : "$聚合字段", url : {$addToSet : "$统计字段"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{$group : {_id : "$聚合字段", first_url : {$first : "$统计字段"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{$group : {_id : "$聚合字段", last_url : {$last : "$统计字段"}}}]) |
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。
主从配置
1、主服务器启动时指定端口和replSet选项
mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"
如:
mongod --port 27017 --dbpath "/data/db" --replSet rs0
注意:
启动后需要通过
rs.initiate()来启动一个新的副本,使设置生效
可以使用
rs.conf()查看配置和
rs.status()查看状态
2、从服务器配置
>rs.add(HOST_NAME:PORT)
如:
>rs.add(192.168.1.100:27017)
分片
备份与恢复
备份命令:mongodump -h 服务器地址 -d 数据库名称 -o 备份存放目录
恢复命令:
mongorestore -h 服务器地址 -d 数据库名称 --directoryperdb 备份存放目录
监控
状态检查:mongostat命令
读取、写入、锁等耗时状况:
mongotop命令
mongodb关系
mongodb中文档与文档之间的关系,可以通过嵌入式关系和
引用式关系进行表示。
嵌入式关系:
"_id":ObjectId("52ffc33cd85242f436000001"), "contact": "987654321", "dob": "01-01-1991", "name": "Tom Benzamin", "address": [ { "building": "22 A, Indiana Apt", "pincode": 123456, "city": "Los Angeles", "state": "California" }, { "building": "170 A, Acropolis Apt", "pincode": 456789, "city": "Chicago", "state": "Illinois" }] }
引用式关系:
{ "_id":ObjectId("52ffc33cd85242f436000001"), "contact": "987654321", "dob": "01-01-1991", "name": "Tom Benzamin", "address_ids": [ ObjectId("52ffc4a5d85242602e000000"), ObjectId("52ffc4a5d85242602e000001") ] }
MongoDB 数据库引用
手动引用DBRefs
DBRefs
引用格式:{ $ref : , $id : , $db : }
$ref:集合名称
$id:引用的id
$db:数据库名称,可选参数
{ "_id":ObjectId("53402597d852426020000002"), "address": { "$ref": "address_home", "$id": ObjectId("534009e4d852427820000002"), "$db": "w3cschoolcc"}, "contact": "987654321", "dob": "01-01-1991", "name": "Tom Benzamin" }
查询分析
使用 explain()
db.users.ensureIndex({gender:1,user_name:1}) db.users.find({gender:"M"},{user_name:1,_id:0}).explain()
{ "cursor" : "BtreeCursor gender_1_user_name_1", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 0, "nscanned" : 1, "nscannedObjectsAllPlans" : 0, "nscannedAllPlans" : 1, "scanAndOrder" : false, "indexOnly" : true, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "indexBounds" : { "gender" : [ [ "M", "M" ] ], "user_name" : [ [ { "$minElement" : 1 }, { "$maxElement" : 1 } ] ] } }
indexOnly: 字段为 true ,表示我们使用了索引。
cursor:因为这个查询使用了索引,MongoDB中索引存储在B树结构中,所以这是也使用了BtreeCursor类型的游标。如果没有使用索引,游标的类型是BasicCursor。这个键还会给出你所使用的索引的名称,你通过这个名称可以查看当前数据库下的system.indexes集合(系统自动创建,由于存储索引信息,这个稍微会提到)来得到索引的详细信息。
n:当前查询返回的文档数量。
nscanned/nscannedObjects:表明当前这次查询一共扫描了集合中多少个文档,我们的目的是,让这个数值和返回文档的数量越接近越好。
millis:当前查询所需时间,毫秒数。
indexBounds:当前查询具体使用的索引。
使用 hint()
强制mongodb使用某个索引。db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
mongodb 原子操作
mongodb不支持事务,所以,在你的项目中应用时,要注意这点。无论什么设计,都不要要求mongodb保证数据的完整性。
但是mongodb提供了许多原子操作,比如文档的保存,修改,删除等,都是原子操作。
所谓原子操作就是要么这个文档保存到Mongodb,要么没有保存到Mongodb,不会出现查询到的文档没有保存完整的情况。
原子操作常用命令
$set:存在时更新,不存在时新增
{ $set : { field : value } }
$unset:删除一个键
{ $unset : { field : 1} }
$inc:对数值类型的键进行增加和减少操作
{ $inc : { field : value } }
$push:把value追加到field数组里去,如果数组不存在则新增。
{ $push : { field : value } }
$pushAll:功能和
$push类似;追加多个值到一个数组字段内
{ $pushAll : { field : value_array } }
$pull:从数组field内删除一个等于value值的文档。
{ $pull : { field : _value } }
$addToSet:增加一个唯一值到数组内,不存在时增加,存在时忽略。
$pop:删除数组的第一个或最后一个元素
{ $pop : { field : 1 } }
$rename:修改字段名称
{ $rename : { old_field_name : new_field_name } }
$bit:位操作,integer类型
{$bit : { field : {and : 5}}}
mongodb 高级索引
索引数组字段如:
{ "address": { "city": "Los Angeles", "state": "California", "pincode": "123" }, "tags": [ "music", "cricket", "blogs" ], "name": "Tom Benzamin" }
建立索引:
db.users.ensureIndex({"tags":1})
使用索引:
db.users.find({tags:"cricket"}).explain()
索引子文档字段
db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})
记住查询表达式必须遵循指定的索引的顺序。
查询限制
索引不能被以下的查询使用:正则表达式及非操作符,如
$nin,
$not, 等。
算术运算符,如
$mod, 等。
$where子句
索引键限制
从2.6版本开始,如果现有的索引字段的值超过索引键的限制,MongoDB中不会创建索引。
插入文档超过索引键限制
如果文档的索引字段值超过了索引键的限制,MongoDB不会将任何文档转换成索引的集合。与mongorestore和mongoimport工具类似。
最大范围
集合中索引不能超过64个
索引名的长度不能超过125个字符
一个复合索引最多可以有31个字段
MongoDB ObjectId
ObjectId 是一个12字节 BSON 类型数据,有以下格式:前4个字节表示时间戳
接下来的3个字节是机器标识码
紧接的两个字节由进程id组成(PID)
最后三个字节是随机数。
创建新的ObjectId
ObjectId()
获取创建文档的时间戳
ObjectId("5349b4ddd2781d08c09890f4").getTimestamp()
ObjectId 转换为字符串
> ObjectId().str 57bb019f1b9653f34d858a03
MongoDB Map Reduce
MongoDB 正则表达式
相关文章推荐
- python操作MongoDB基础知识
- MongoDB基础知识 02
- mongodb基础命令和知识
- mongodb的基础知识
- mongoDB基础知识3----启动命令mongod参数说明
- mongodb基础命令及基本知识
- mongoDB基础知识----搭建简单的monogoDB服务器
- 基于C#的MongoDB数据库开发应用(1)--MongoDB数据库的基础知识和使用
- mongodb 3.2 知识简记-基础知识和基本操作
- mongodb的安装和基础知识
- MongoDB教程之入门基础知识
- MongoDB使用学习(一)-基础知识
- mongodb 集群基础知识
- 【MongoDB系列】:MongoDB基础知识
- mongodb基础知识(图片)
- Mongodb 笔记01 MongoDB 简介、MongoDB基础知识、启动和停止MongoDB
- mongodb学习02基础知识
- mongoDB基础知识2----基本操作(CRUD),索引(常见、全文、地理位置)
- 基于C#的MongoDB数据库开发应用(1)--MongoDB数据库的基础知识和使用