MongoDB 快速入门(一)

MongoDB 快速入门

简介

MongoDB 是一款开源的,高可用,高性能和可拓展的文档型非关系数据库。相比于常见的 SQL 数据库,Mongo可以存储更加复杂数据结构的数据,但它没有类似与 SQL 的操作语言,学习成本稍高些。

MongoDB 中对应于 MySQL 中数据库,表,数据,字段的关系

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase 数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
tablejoins表连接,MongoDB不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

快速开始

为了减少安装的麻烦,可以直接使用 docker 拉取官方的 mongo 镜像:

docker pull mongo

启动镜像:

docker run --name mongo -d mongo

进入 mongo 容器:

docker exec -it mongo bash

连接数据库

默认连接

mongo 
或
mongo mongodb://localhost

带账号密码的连接

mongo mongodb://账号:密码@localhost

指定数据库的连接

mongo mongodb://localhost/数据库名
或
mongo mongodb://账号:密码@localhost/数据库名

数据库操作

创建数据库

MongoDB 使用 use 命令创建数据库,如果数据库不存在,MongoDB 会在第一次使用该数据库时创建数据库。如果数据库已经存在则连接数据库,然后可以在该数据库进行各种操作。

use myDB
查看数据库
show dbs;

admin   0.000GB
config  0.000GB
local   0.000GB
删除数据库
db.DropDatabase()

集合操作

查看集合

选中数据库后,查看有哪些集合,相当于查看当前数据库下的表

show collections;
创建集合

创建集合相当于在所选数据库中建表

mongo中创建集合有两种方式,显式创建和隐式创建。

显式创建

db.createCollection(name, options)

name 为 集合名
options 相关的参数如下

参数类型描述
cappedBoolean(可选)如果为 true,则启用封闭的集合。上限集合是固定大小的集合,它在达到其最大时自动覆盖其最旧的条目。如果指定 true,则还需要指定 size 参数
size数字(可选)指定上限集合的最大大小(以字节为单位)。如果 capped 为 true,那么还需要指定次字段的值
max数字(可选)指定上限集合中允许的最大文档数

显式创建的demo:

db.createCollection("myCollection", {capped:true, size: 10000, max:9999})

隐式创建
在 MongoDB 中,当插入文档时,如果集合不存在,MongoDB 会隐式的自动创建集合,比如:

db.myDB.insert({"name":"wgj", "money":"5"})

显示集合

show collections
删除集合
db.集合名.Drop()
更新集合
db.集合名.renameCollection("yourDB")

文档操作

查看所有文档
db.集合名.find()
或
db.集合名.find().pretty()
插入文档

插入文档

db.集合名.insert(json形式的数据,可以是列表)

推荐使用以下两种:

db.集合名.insertOne() 用于向集合插入一个新文档,语法格式如下:

db.collection.insertOne(
   <document>,
   {
      writeConcern: <document>
   }
)

db.collection.insertMany() 用于向集合插入一个多个文档,语法格式如下:

db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)

参数说明:

document:要写入的文档。
writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
ordered:指定是否按顺序写入,默认 true,按顺序写入。

删除文档
db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)

参数说明:

query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
writeConcern :(可选)抛出异常的级别。

比如,删除 name 为 foo 的文档,

db.collection.remove({'name': 'foo'})
更改文档
db.collection.update(
    <query>,
    <update>,
    {
        upsert,
        multi,
        writeConcern,
        collation
    }
)

参数说明:
<query>:参数设置查询条件。
<update>:为更新操作符。
upsert:为布尔型可选项,表示如果不存在 update 的记录,是否插入这个新的文档。true 为插入;默认为 false,不插入。
multi:也是布尔型可选项,默认是 false,只更新找到的第一条记录。如果为 true,则把按条件查询出来的记录全部更新。
writeConcem:表示出错级别。
collation:指定语言。

一般是根据query语句查询到对应的文档,然后根据update语句进行更新:

db.集合名.update({"字段":"我是old值"}, {$set:{"字段":"我是new值"}})

这种只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。

db.集合名.update({"字段":"我是old值"}, {$set:{"字段":"我是new值"}}, {multi: true})
保存文档

save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入。语法格式如下:

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)

参数说明:

document : 文档数据。
writeConcern :可选,抛出异常的级别。

高级操作

前面说的 find() 方法是不带参数的,查询的是集合所有的文档。
这里来看下带参数的 find() 方法。

条件查询

带参数的 find() 语法如下:

db.集合名.find(query, projection)

参数说明:

  • query: 可选项,指定的查询条件;
  • projection: 可选项,指定返回的字段,如果忽略此选项则返回所有字段;

为了便于理解,可以将 MongoDB 中的条件查询和 MySQL 的条件查询对比着看:

操作符格式实例与 RDBMS where 语句比较
等于(=){<key> : {}}db.test.find( {price : 24} )where price = 24
大于(>){<key> : {$gt : }}db.test.find( {price : {$gt : 24}} )where price > 24
小于(<){<key> : {$lt : }}db.test.find( {price : {$lt : 24}} )where price < 24
大于等于(>=){<key> : {$gte : }}db.test.find( {price : {$gte : 24}} )where price >= 24
小于等于(<=){<key> : {$lte : }}db.test.find( {price : {$lte : 24}} )where price <= 24
不等于(!=){<key> : {$ne : }}db.test.find( {price : {$ne : 24}} )where price != 24
与(and){key01 : value01, key02 : value02, …}db.test.find( {name : “《MongoDB 入门教程》”, price : 24} )where name = “《MongoDB 入门教程》” and price = 24
或(or){$or : [{key01 : value01}, {key02 : value02}, …]}db.test.find( {$or:[{name : “《MongoDB 入门教程》”},{price : 24}]} )where name = “《MongoDB 入门教程》” or price = 24
查询有关的方法

limit()
limit() 函数与 SQL 中的作用相同,用于限制查询结果的个数,如下语句只返回 3 个匹配的结果。若匹配的结果不到 3 个,则返回匹配数量的结果:

db.test.find().limit(3)

skip()
Skip() 函数用于略过指定个数的文档,如下语句略过第一个文档,返回后两个:

db.集合名.find().skip(1)

类似于 MySQL 中的 offset。

sort()
sort() 函数用于对查询结果进行排序,1 是升序,-1 是降序,如下语句可将查询结果升序显示:

db.集合名.find().sort({"price" : 1})
游标

游标是指对数据一行一行地进行操作,在 MongoDB 数据库中对游标的控制非常简单,只需使用 firid() 函数就可以返回游标。

MongoDB 游标的使用

方法名作用
hasNext判断是否有更多的文档
next用来获取下一条文档
toArray将查询结构放到数组中
count查询的结果为文档的总数量
limit限制查询结果返回数量
skip跳过指定数目的文档
sort对查询结果进行排序
objsLeftlnBatch查看当前批次剩余的未被迭代的文档数量
addOption为游标设置辅助选项,修改游标的默认行为
hint为查询强制使用指定索引
explain用于获取查询执行过程报告
snapshot对查询结果使用快照

使用游标时,需要注意下面 4 个问题。

  1. 当调用 find() 函数时,Shell 并不立即查询数据库,而是等真正开始获取结果时才发送查询请求。

  2. 游标对象的每个方法几乎都会返回游标对象本身,这样可以方便进行链式函数的调用。

  3. 在 MongoDB Shell 中使用游标输出文档包含两种情况,如果不将 find() 函数返回的游标赋值给一个局部变量进行保存,在默认情况下游标会自动迭代 20 次。如果将 find() 函数返回的游标赋值给一个局部变量,则可以使用游标对象提供的函数进行手动迭代。

  4. 使用清空后的游标,进行迭代输出时,显示的内容为空。

游标从创建到被销毁的整个过程存在的时间,被称为游标的生命周期,包括游标的创建、使用及销毁三个阶段。当客户端使用 find() 函数向服务器端发起一次查询请求时,会在服务器端创建一个游标,然后就可以使用游标函数来操作查询结果。

以下三种情况会让游标被销毁。

  • 客户端保存的游标变量不在作用域内。
  • 游标遍历完成后,或者客户端主动发送终止消息。
  • 在服务器端 10 分钟内未对游标进行操作。

以下语句显示使用游标查找所有文档:

>var cursor = db.test.find()
>while (cursor.hasNext()){
    var doc = cursor.next();
    print(doc.name);  //把每一条数据都单独拿出来进行逐行的控制
    print(doc);  //将游标数据取出来后,其实每行数据返回的都是一个[object BSON]型的内容
    printjson(doc);  //将游标获取的集合以JSON的形式显示
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值