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 协议》,转载必须注明作者和本文链接