MongoDB快速入门
运行mongodb
运行并设置数据目录
mongod.exe --dbpath d:\data\db
作为服务运行
. -- -- . --
-- -- --
-- --
- –bind_ip 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP
- –logpath 定MongoDB日志文件,注意是指定文件不是目录
- –logappend 使用追加的方式写日志
- –dbpath 指定数据库路径
- –port 指定服务端口号,默认端口27017
- –serviceName 指定服务名称
- –serviceDisplayName 指定服务名称,有多个mongodb服务时执行。
- –install 指定作为一个Windows服务安装。
进入shell
mongo
MongoDB概念解析
SQL术语/概念 | MongoDB术语/概念 | 解释说明 |
---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | | 表连接,MongoDB不支持 |
primary key | primary key | 主键,MongoDB自动将_id设置为主键 |
MongoDB常用操作
连接到数据库
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
创建数据库
use test
show dbs
-- 插入数据
db.mydb.insert({"name":"ck"})
-- 创建表
db.createCollection("log");
db.mydb.drop();
show tables;
删除数据库
-- 删除当前数据库
db.dropDatabase()
插入记录(插入文档)
document的结构和json一样,所有存储在集合(collection)中的数据都时BSON(Binary JSON)。
db.COLLECTION_NAME.insert(doucument)
插入文档你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
更新文档
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
-- 实例
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如
,
inc…)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
删除文档
db.collection.remove(
<query>,
<justOne>
)
-- VERSION >= 2.6
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
查询文档
db.COLLECTION_NAME.find()
-- 美化输出
db.COLLECTION_NAME.find().pretty()
和RDBMS查询Where比较:
操作 |
格式 |
范例 |
RDBMS中类似语句 |
等于 |
{key:value} |
db.col.find({“by”:”age”}).pretty() |
where by = “age” |
小于 |
{key:{lt:value}}|db.col.find({"likes":{lt:50}}).pretty() where likes<50 小于或等于 {key:{lte:value}}|db.col.find("likes":{lte:50}).pretty() where likes<=50 类似的有大于(
gt),大于或等于(
gte),不等于($ne)。
db.col.find({key1:value1, key2:value2}).pretty()
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
- 根据字段类型匹配
使用$type关键字,对应的字段类型列表如下:
类型 | 数字 | 备注 |
---|
Double | 1 | | String | 2 | | Object | 3 | | Array | 4 | | Binary data | 5 | | Undefined | 6 | 已废弃 | Object id | 7 | | Boolean | 8 | | Date | 9 | | Null | 10 | | Regular Expression | 11 | | JavaScript | 13 | | Symbol | 14 | | JavaScript (with scope) | 15 | | 32-bit integer | 16 | | Timestamp | 17 | | 64-bit integer | 18 | | Min key | 255 | Query with -1. | Max key | 127 | |
db.COLLECTION_NAME.find().limit(NUMBER)
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
- Sort排序
sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列 db.COLLECTION_NAME.find().sort({KEY:1}) 建立索引 -- 创建索引
db.COLLECTION_NAME.ensureIndex({KEY:1})
-- 查询索引
db.COLLECTION_NAME.getIndexes(); 语法中 Key值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。
background :Boolean建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false。unique :Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为false.name :string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。dropDups :Boolean 在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.sparse : Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 falseexpireAfterSeconds :integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。v :index version 索引的版本号。默认的索引版本取决于mongod创建索引时 运行的版本。weights :document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。default_language :string对于文本索引,该参数决定了停用词及词干和词器的规则的 列表。默认为英语language_override :string 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. 聚合(待补充) MongoDB复制(副本集) 副本集设置 -- -- --
--
-- -- --
-- -- --
--
>.
>.... 只能通过主节点执行add操作添加副本集,被添加的副本集名称要与主节点副本一致;主机宕机后,副本会接管成为主节点。 MongoDB 分片(待补充) 备份与恢复 mongodump -h dbhost -d dbname -o dbdirectory
mongorestore -h dbhost -d dbname --directoryperdb dbdirectory 监控 mongostat 和mongotop MongoDB 原子操作 mongodb不支持事务,所以,在你的项目中应用时,要注意这点。无论什么设计,都不要要求mongodb保证数据的完整性。 但是mongodb提供了许多原子操作,比如文档的保存,修改,删除等,都是原子操作。 所谓原子操作就是要么这个文档保存到Mongodb,要么没有保存到Mongodb,不会出现查询到的文档没有保存完整的情况。 原子操作命令
命令 | 语法 | 描述 |
---|
set|{set:{field:value}} | 更新键值,不存在则创建 | | unset|{unset:{field:1}} | 删除键 | | inc|{inc:{field:value}} | 为数字型键进行增减操作 | | push|{push:{field:value}} | 追加到field,field必须为数组,不存在则创建 | | pushAll|{pushAll:{field:value_array}} | 同上 | | pull|{pull:{field:value}} | 从数组field删除等于value的值 | | addToSet|{addToSet:{field:value}} | 添加到数组,值不存在才添加 | | pop|{pop:{field:1}} | 删除数组第一个(-1)或者最后一个(1)元素 | | rename|{rename:{old_field_name:new_field_name}} | 修改字段名 | | bit|{bit:{field:{and:5}}} | 位操作,integer类型 | | MongoDB ObjectId ObjectId 是一个12字节 BSON 类型数据,有以下格式:
- 前4个字节表示时间戳
- 接下来的3个字节是机器标识码
- 紧接的两个字节由进程id组成(PID)
- 最后三个字节是随机数。
MongoDB备份 非主节点都不具备写入能力。 主从复制模式 mongod启动默认dbpath是当前根目录下的mongodb/db目录,需要手动创建,若不存在启动可能会失败。可复制多分mongodb实例测试。 --
--.. - --
--
--.. -- -- --...
--
...
.....
.. 注册用复制启动成功后,从备库查询报错:not master and slaveOk=false。解决办法:从mongo客户端执行 db.getMongo().setSlaveOk() 。 副本集模式 与主从复制的区别:
- 没有特定的主数据库
- 如果主数据库宕机,集群中会推选一个从数据库作为主数据库顶上,具备自动恢复能力。
- 集群中包含一个仲裁节点,集群中数据库数目最好为奇数(包含仲裁数据库),方便仲裁。
配置示例1(假设replSet的名称为myrep):
mongod
mongod
db.initiate({"_id":"myrep","members":[{"_id":1,"host":"127.0.0.1:2222"},{"_id":2,"host":"127.0.0.1:3333"}]});
mongo
db.addArb("127.0.0.1:4444")
确定要放弃本次机会?
福利倒计时
:
:
立减 ¥
普通VIP年卡可用
立即使用
12-01
977
09-19
4248
成就一亿技术人!
|