MongoDB 学习
MongoDB 连接
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
mongodb:\\
这是固定格式,必须要指定- username:password@ 可选 用户名:密码
- host1 必须指定至少一个host,连接复制集,请指定多个主机地址
- port 可选指定端口,如果不填,默认 27017
- /database 如果指定username:password@,连接并验证登陆指定数据库。若不指定,默认打开 test 数据库
- ?options是连接选项,如果不使用/database,则前面需要加上/。
MongoDB 连接命令格式
$ ./mongo
MongoDB shell version: 4.0.9
connecting to: test
使用用户 admin 使用密码 123456 连接到本地的 MongoDB 服务上。输出结果如下所示:
> mongodb://admin:123456@localhost/
...
更多连接实例
连接本地数据库服务器,端口是默认的。
mongodb://localhost
使用用户名fred,密码foobar登录localhost的admin数据库。
mongodb://fred:foobar@localhost
使用用户名fred,密码foobar登录localhost的baz数据库。
mongodb://fred:foobar@localhost/baz
连接 replica pair, 服务器1为example1.com服务器2为example2。
mongodb://example1.com:27017,example2.com:27017
连接 replica set 三台服务器 (端口 27017, 27018, 和27019):
mongodb://localhost,localhost:27018,localhost:27019
连接 replica set 三台服务器, 写入操作应用在主服务器 并且分布查询到从服务器。
mongodb://host1,host2,host3/?slaveOk=true
直接连接第一个服务器,无论是replica set一部分或者主服务器或者从服务器。
mongodb://host1,host2,host3/?connect=direct;slaveOk=true
当你的连接服务器有优先级,还需要列出所有服务器,你可以使用上述连接方式。
安全模式连接到localhost:
mongodb://localhost/?safe=true
以安全模式连接到replica set,并且等待至少两个复制服务器成功写入,超时时间设置为2秒。
mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000
MongoDB 创建数据库
创建数据库
use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库
查看数据库
db
查看所有数据库
show dbs
刚创建的数据库并不在全部数据库列表中,如果显示,需要插入数据
MongoDB 删除数据库
删除当前数据库
db.dropDatabase()
删除集合
db.collection.drop()
以下实例删除了 runoob 数据库中的集合 site:
> use runoob
switched to db runoob
> db.createCollection("runoob") # 先创建集合,类似数据库中的表
> show tables
runoob
> db.runoob.drop()
true
> show tables
>
MongoDB 创建集合
db.createCollection(name,options)
- name:要创建的集合名称
- options:要选参数,指定有关内存大小及索引的选项
options 可以是如下参数 | 字段 | 类型 | 描述 |
---|---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。 | |
autoIndexId | 布尔 | (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 | |
size | 数值 | (可选)为固定集合指定一个最大值(以字节计)。如果 capped 为 true,也需要指定该字段。 | |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
> db.createCollection("mycol", { capped : true, autoIndexId : true, size :
6142800, max : 10000 } )
{ "ok" : 1 }
>
MongoDB 删除集合
db.collection.drop() # collection是集合名
MongoDB 插入文档
db.COLLECTION_NAME.inset(document)
以下文档可以存储在 MongoDB 的 runoob 数据库 的 col 集合中:
>db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
以上实例中 col 是我们的集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。
查看已插入文档:
以上实例中 col 是我们的集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。
查看已插入文档:
> db.col.find()
{ "_id" : ObjectId("56064886ade2f21f36b03134"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
>
我们也可以将数据定义为一个变量,如下所示:
> document=({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
插入文档你也可以使用 db.col.save(document)
命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
MongoDB 更新文档
update()方法
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 :可选,抛出异常的级别。
save()方法
save()方法通过传入的文档来代替已有的文档
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
参数说明:
- document:文档数据
- writeConcern:可选,抛出异常的级别
更多实例
只更新第一条记录:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一条:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加进去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一条记录:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
MongoDB 删除文档
db.collection.remove(
<query>,
<justOne>
)
- query:可选,删除文档的条件
- justOne:可选,如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档
MongoDB 查询文档
db.collection.find(query, projection)
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
若不指定 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}) // 正确
若不想指定查询条件参数 query 可以 用 {} 代替,但是需要指定 projection 参数:
querydb.collection.find({}, {title: 1})
易读的方式来读取数据
>db.col.find().pretty()
pretty() 方法以格式化的方式来显示所有文档 除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档 |
操作 | 格式 | 范例 | 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 |
实例
如果是 qty 大于 50 小于 80 不能这样写:
db.posts.find( { qty: { $gt: 50 }, qty: { $lt: 80 } } )
应该这样:
db.posts.find( { qty: { $gt: 50 ,$lt: 80}} )
MongoDB and条件
MongoDB的find()方法可以传入多个键(key),每个键(key)以逗号隔开,即常规SQL的AND条件
>db.col.find({key1:value1, key2:value2}).pretty()
AND 和 OR 联合使用
以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: 'where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')'
>db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
MongoDB 条件操作符
(>) 大于 - $gt greater than
(<) 小于 - $lt gt equal
(>=) 大于等于 - $gte less than
(<=) 小于等于 - $lte lt equal
(!=) 不等于 - $ne not equal
(=) 等于 - $eq equal
MongoDB (>) 大于操作符 - $gt
获取 "col" 集合中 "likes" 大于 100 的数据
db.col.find({likes : {$gt : 100}})
类似SQL:select * from col where likes >100;
MongoDB(>=)大于等于操作符 - $gte
获取"col"集合中 "likes" 大于等于 100 的数据
db.col.find({likes : {$gte : 100}})
类似SQL:select * from col where likes >=100;
MongoDB (<) 小于操作符 - $lt
获取"col"集合中 "likes" 小于 150 的数据
db.col.find({likes : {$lt : 150}})
类似SQL:select * from col where likes < 150;
MongoDB (<=) 小于等于操作符 - $lte
获取"col"集合中 "likes" 小于等于 150 的数据
db.col.find({likes : {$lte : 150}})
类似SQL:select * from col where likes <= 150;
MongoDB 使用 (<) 和 (>) 查询 - $lt 和 $gt
获取"col"集合中 "likes" 大于100,小于 200 的数据
db.col.find({likes : {$lt :200, $gt : 100}})
类似SQL:Select * from col where likes>100 AND likes<200;
模糊查询
查询 title 包含"教"字的文档:
db.col.find({title:/教/})
查询 title 字段以"教"字开头的文档:
db.col.find({title:/^教/})
查询 titl e字段以"教"字结尾的文档:
db.col.find({title:/教$/})
本作品采用《CC 协议》,转载必须注明作者和本文链接