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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!