最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

MongoDB

IT圈 admin 24浏览 0评论

MongoDB

目录

    • MongoDB介绍
    • MongoDB安装
    • MongoDB基本操作
      • 1.链接数据库
      • 2.CRUD 操作
      • 3.创建(Create)
      • 4.查找(Read)
      • 5.更新(Update)
      • 6.删除(Delete)
      • 7.导入json文件
      • 8.导出json文件
    • 每日一面
        • 1.什么是MongoDB
        • 2.MongoDB的优势有哪些
        • 3 为什么用MOngoDB?
        • 4 在哪些场景使用MongoDB

MongoDB介绍

关系型数据库:( 增 insert / 删 delete / 改 update / 查 select )
mysql sqlserver oracle db2 access
非关系型数据库
mongodb redis hbase

MongoDB是一个NoSQL数据库,它是跨平台的,基于分布式文件存储的数据库,由C++语言编写的(这点很重要,则表示在Linux下需要安装gcc环境)。MongoDB是以文档的形式存储数据,数据结构由键值(key:value)对组成,类似JSON。

MongoDB结构,最小的单位为文档(类似MySQL的行),每一个文档用的是BSON形式来存储(类似JSON),文档的上一层为集合(类似MySQL的表),再上一级为库(类似MySQL的数据库)。

简而言之,MongoDB是一个免费开源跨平台的 NoSQL 数据库,与关系型数据库不同,MongoDB 的数据以类似于 JSON 格式的二进制文档存储:

{name: "我没有三颗心脏",age: 22,
}

以使用我们熟悉的 MySQL 数据库来加以对比:

MySQL 基础概念MongoDB 对应概念
数据库(database)容器(database)
表(table)集合(collection)
行(row)文档(document)
列(column)域(filed)
索引(index)索引(index)

也借用一下菜鸟教程的图来更加形象生动的说明一下:

常用shell命令:

  1. show dbs; 查看数据库有哪些

  2. use DATABASE_NAME;如果数据库不存在,则创建数据库,否则切换到指定数据库。

  3. db.dropDatabase() 删除数据库

  4. db.createCollection(“runoob”); 创建数据库的集合名称

  5. show collections; 查看数据库里有多少个集合

  6. db.mycol2.insert({“name” : “菜鸟教程”}); 给 mycol2这个集合,插入一条数据

  7. db.collection.drop(); 删除一个集合

  8. db.teachers.insertOne({“name”:“wangdong”}); 插入一条数据

  9. db.teachers.insertMany([{“name”:“liu”},{“name”:“li”},{“name”:“wang”}]) 集合插入多天数据

  10. db.teachers.find() 查看teachers这个集合有多少条数据

    11.db.teachers.find().sort({“age”:-1}); 按照年龄排序,这个-1,是降序排列,1是升序排列。

MongoDB安装

MongoDB官网

  • mac下mongodb安装教程:
  • windows下mongodb安装教程:

下载 msi 文件,下载后双击该文件,按操作提示安装即可

安装过程中,你可以通过点击 “Custom(自定义)” 按钮来设置你的安装目录。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JZ61VeXL-1608902727843)(D:\积云\学习大纲\课件p333333\day12 MongoDB\day12 MongoDB\img\1.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SKuRPHES-1608902727846)(D:\积云\学习大纲\课件p333333\day12 MongoDB\day12 MongoDB\img\2.jpg)]

这里我选择的是自定义安装,选择你想安装到的位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NoPN8uJV-1608902727847)(D:\积云\学习大纲\课件p333333\day12 MongoDB\day12 MongoDB\img\9.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5DIsJz7F-1608902727848)(D:\积云\学习大纲\课件p333333\day12 MongoDB\day12 MongoDB\img\1599348990(1)].png)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bhhQ42Fz-1608902727849)(D:\积云\学习大纲\课件p333333\day12 MongoDB\day12 MongoDB\img\3.jpg)]

最后安装成功会弹出一个警告框,选中 Ignore 就好

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xo1iqlgy-1608902727851)(D:\积云\学习大纲\课件p333333\day12 MongoDB\day12 MongoDB\img\11.png)]

最后打开bin/mongod.cfg 文件,注释掉最后面的mp:,至此大功告成

启动mongodb

mongod --dbpath F:\MongoDB\data

接下来在浏览器中输入http://127.0.0.1:27017/,当出现下面那行字的时候就说明服务开起来了

It looks like you are trying to access MongoDB over HTTP on the native driver port.

配置mongod服务到winows启动命令中

(为了电脑启动时候数据库也是未启动,节省电脑内存和cpu,需要的时候启动)

  1. 在当前bin目录下启动cmd,运行下面命令(部分电脑需要以管理员身份运行cmd)
mongod --config "F:\MongoDB\bin\mongod.cfg" --install
  1. 右键我的电脑->管理->服务和应用程序->服务
  2. 找到MongoDB Server 改成手动启动,至此大功告成,以后需要mongdb数据库时候来这里手动启动就ok了

配置mongod服务全局shell启动入口

(为了在任何位置的cmd中都可以使用mongo操作)

  1. 此电脑右击->属性->高级系统设置-环境变量

  2. 点击系统变量中的新建

  3. 选中下面系统变量Path那一栏中点击编辑,新建,输入mongodb中bin目录的路径 // F:\MongoDB\bin

    上面如果已配置完成在任何地方可以使用mongo命令直接启动,如果上面未配置启动mongodb需要找到mongodb所在的路径点开bin目录 在地址栏输入cmd,执行mongo 即可

    注意:这里由于没有执行mongod,就直接执行mongo,这里会报错,不必担心,老师送上解决办法

    解决方式:
    1、先打开\bin 使用命令 mongod –dbpath指定db路径
    2、重新打开一个DOS再启动mongo
    

MongoDB基本操作

通过上面的步骤我们在系统里运行了一个 mongodb 实例,接下来通过 mongo 命令来连接它:

1.链接数据库

mongo 127.0.0.1:27017

mongo [options] [db address] [file names]

由于上面运行的 mongodb 运行在 27017 端口,并且灭有启动安全模式,所以我们也不需要输入用户名和密码就可以直接连接:

mongo 127.0.0.1:27017

或者通过 --host--port 选项指定主机和端口。一切顺利的话,就进入了 mongoDB shellshell 会报出一连串权限警告,不过不用担心,这并不会影响之后的操作。在添加授权用户和开启认证后,这些警告会自动消失。

2.CRUD 操作

在进行增删改查操作之前,我们需要先了解一下常用的 shell 命令:

  • db 显示当前所在数据库,默认为 test
  • show dbs 列出可用数据库
  • show tables show collections 列出数据库中可用集合
  • use newDatabase 用于切换数据库

mongoDB 预设有两个数据库,admin 和 local,admin 用来存放系统数据,local 用来存放该实例数据,在副本集中,一个实例的 local 数据库对于其它实例是不可见的。使用 use 命令切换数据库:

> use admin
> use local
> use newDatabase

可以 use 一个不存在的数据库,当你存入新数据时,mongoDB 会创建这个数据库:

> use newDatabase
> db.newCollection.insert({x:1})
WriteResult({ "nInserted" : 1 })

以上命令向数据库中插入一个文档,返回 1 表示插入成功,mongoDB 自动创建 newCollection 集合和数据库 newDatabase。下面将对增查改删操作进行一个简单的演示。

3.创建(Create)

MongoDB 提供 insert 方法创建新文档:

  • db.collection.inserOne() 插入单个文档
  • db.collection.inserMany() 插入多个文档
  • db.newDatabase.insert() 插入单条或多条文档

我们接着在刚才新创建的 newDatabase 下面新增数据吧:

db.newDatabase.insert({name:"wmyskxz",age:22})

根据以往经验应该会觉得蛮奇怪的,因为之前在这个集合中插入的数据格式是 {x:1} 的,而这里新增的数据格式确是 {name:"wmyskxz",age:22} 这个样子的。还记得吗,文档型数据库的与传统型的关系型数据的区别就是在这里!

并且要注意,age:22age:"22" 是不一样的哦,前者插入的是一个数值,而后者是字符串,我们可以通过 db.newCollection.find() 命令查看到刚刚插入的文档:

> db.newDatabase.find()
{ "_id" : ObjectId("5cc1026533907ae66490e46c"), "x" : 1 }
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz", "age" : 22 }

这里有一个神奇的返回,那就是多了一个叫做 _id 的东西,这是 MongoDB 为你自动添加的字段,你也可以自己生成。大部分情况下还是会让 MongoDB 为我们生成,而且默认情况下,该字段是被加上了索引的。

4.查找(Read)

MongoDB 提供 find 方法查找文档,第一个参数为查询条件:

  • db.newDatabase.find() 查找当前集合中的所有数据
  • db.collection.find({条件对象}) 将符合条件的数据查出来
  • db.collection.findOne() 查询到的第一个对象
  • db.collection.find().pretty() 将找到的数据已格式化的结果显示出来
> db.newDatabase.find() # 查找所有文档
{ "_id" : ObjectId("5cc1026533907ae66490e46c"), "x" : 1 }
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz", "age" : 22 }
> db.newDatabase.find({name:"wmyskxz"}) # 查找 name 为 wmyskxz 的文档
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz", "age" : 22 }
> db.newDatabase.find({age:{$gt:20}}) # 查找 age 大于 20 的文档
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz", "age" : 22 }

上述代码中的$gt对应于大于号>的转义。

第二个参数可以传入投影文档映射数据:

> db.newCollection.find({age:{$gt:20}},{name:1})
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz" }

上述命令将查找 age 大于 20 的文档,返回 name 字段,排除其他字段。投影文档中字段为 1 或其他真值表示包含,0 或假值表示排除,可以设置多个字段位为 1 或 0,但不能混合使用。

为了测试,我们为这个集合弄了一些奇奇怪怪的数据:

> db.newDatabase.find()
{ "_id" : ObjectId("5cc1026533907ae66490e46c"), "x" : 1 }
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz", "age" : 22 }
{ "_id" : ObjectId("5cc108fb33907ae66490e46e"), "name" : "wmyskxz-test", "age" : 22, "x" : 1, "y" : 30 }

然后再来测试:

> db.newCollection.find({age:{$gt:20}},{name:1,x:1}) 
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz" }
{ "_id" : ObjectId("5cc108fb33907ae66490e46e"), "name" : "wmyskxz-test", "x" : 1 }
> db.newCollection.find({age:{$gt:20}},{name:0,x:0}) 
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "age" : 22 }
{ "_id" : ObjectId("5cc108fb33907ae66490e46e"), "age" : 22, "y" : 30 }
> db.newCollection.find({age:{$gt:20}},{name:0,x:1})
Error: error: {"ok" : 0,"errmsg" : "Projection cannot have a mix of inclusion and exclusion.","code" : 2,"codeName" : "BadValue"
}

从上面的命令我们就可以把我们的一些想法和上面的结论得以验证,perfect!

除此之外,还可以通过 countskiplimit 等指针(Cursor)方法,改变文档查询的执行方式:

> db.newCollection.find().count()
3
> db.newCollection.find().skip(1).limit(10).sort({age:1})
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz", "age" : 22 }
{ "_id" : ObjectId("5cc108fb33907ae66490e46e"), "name" : "wmyskxz-test", "age" : 22, "x" : 1, "y" : 30 }

上述查找命令跳过 1 个文档,限制输出 10 个,以 age 子段正序排序(大于 0 为正序,小于 0 位反序)输出结果。最后,可以使用 Cursor 方法中的 pretty 方法,提升查询文档的易读性,特别是在查看嵌套的文档和配置文件的时候:

> db.newCollection.find().pretty()
{ "_id" : ObjectId("5cc1026533907ae66490e46c"), "x" : 1 }
{"_id" : ObjectId("5cc102fb33907ae66490e46d"),"name" : "wmyskxz","age" : 22
}
{"_id" : ObjectId("5cc108fb33907ae66490e46e"),"name" : "wmyskxz-test","age" : 22,"x" : 1,"y" : 30
}

5.更新(Update)

MongoDB 提供 update 方法更新文档:

  • db.collection.updateOne() 更新最多一个符合条件的文档
  • db.collection.updateMany() 更新所有符合条件的文档
  • db.collection.replaceOne() 替代最多一个符合条件的文档
  • db.newDatabase.update() 默认更新一个文档,可配置 multi 参数,跟新多个文档**

update() 方法为例。其格式:

> db.collection.update(<query>,<update>,{upsert: <boolean>,multi: <boolean>}
)

各参数意义:

  • query 为查询条件
  • update 为修改的文档
  • upsert 为真,查询为空时插入文档
  • multi 为真,更新所有符合条件的文档

下面我们测试把 name 字段为 wmyskxz 的文档更新一下试试:

> db.newCollection.update({name:"wmyskxz"},{name:"wmyskxz",age:30})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

要注意的是,如果更新文档只传入 age 字段,那么文档会被更新为{age: 30},而不是{name:"wmyskxz", age:30}。要避免文档被覆盖,需要用到 $set 指令,$set 仅替换或添加指定字段:

> db.newCollection.update({name:"wmyskxz"},{$set:{age:30}})

如果要在查询的文档不存在的时候插入文档,要把 upsert 参数设置真值:

> db.newCollection.update({name:"wmyskxz11"},{$set:{age:30}},{upsert:true})

update 方法默认情况只更新一个文档,如果要更新符合条件的所有文档,要把 multi 设为真值,并使用 $set 指令:

> db.newCollection.update({age:{$gt:20}},{$set:{test:"A"}},{multi:true})
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
> db.newCollection.find()
{ "_id" : ObjectId("5cc1026533907ae66490e46c"), "x" : 1 }
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz", "age" : 30, "test" : "A" }
{ "_id" : ObjectId("5cc108fb33907ae66490e46e"), "name" : "wmyskxz-test", "age" : 22, "x" : 1, "y" : 30, "test" : "A" }
{ "_id" : ObjectId("5cc110148d0a578f03d43e81"), "name" : "wmyskxz11", "age" : 30, "test" : "A" }

6.删除(Delete)

MongoDB 提供了 delete 方法删除文档:

  • db.collection.deleteOne() 删除最多一个符合条件的文档
  • db.collection.deleteMany() 删除所有符合条件的文档
  • db.newDatabase.remove() 删除一个或多个文档

以 remove 方法为例:

> db.newCollection.remove({name:"wmyskxz11"})
> db.newCollection.remove({age:{$gt:20}},{justOne:true})
> db.newCollection.find()
{ "_id" : ObjectId("5cc1026533907ae66490e46c"), "x" : 1 }
{ "_id" : ObjectId("5cc108fb33907ae66490e46e"), "name" : "wmyskxz-test", "age" : 22, "x" : 1, "y" : 30, "test" : "A" }

MongoDB 提供了 drop 方法删除集合,返回 true 表面删除集合成功:

> db.newCollection.drop()

7.导入json文件

我这里是已经创建好了数据库test,如果你要新建数据库,直接use test,是创建不成功的,需要插入一条数据。db.user.insert({name:"xiaoming",age:23})

命令:

mongoimport --db test --collection user --file C:\Users\zhang_zk\Desktop\new.json

说明:
1.进入你电脑的mongobd安装的bin目录。
2.执行mongoimport的命令。
test:数据库名
user:集合名
C:\Users\zhang_zk\Desktop\new.json   :你的json文件的路径

8.导出json文件

mongoexport -d 数据库名 -c collections的名字 -o filename.json/filename.csv -f field 参数

说明:
1. -d   数据库名(database)
2. -c   collections名
3. -o   要存入的文件名(xxx.json/xxx.csv)
4. -f   输出特定属性列(一般情况下可以不加这个参数)

例子:

每日一面

1.什么是MongoDB

MongoDB是一个文档数据库,提供好的性能,领先的非关系型数据库。采用BSON存储文档数据。
BSON()是一种类json的一种二进制形式的存储格式,简称Binary JSON.
相对于json多了date类型和二进制数组。

2.MongoDB的优势有哪些

  • 面向文档的存储:以 JSON 格式的文档保存数据。
  • 任何属性都可以建立索引。
  • 复制以及高可扩展性。
  • 自动分片。
  • 丰富的查询功能。
  • 快速的即时更新。

3 为什么用MOngoDB?

  • 架构简单
  • 没有复杂的连接
  • 深度查询能力,MongoDB支持动态查询。
  • 容易调试
  • 容易扩展
  • 不需要转化/映射应用对象到数据库对象
  • 使用内部内存作为存储工作区,以便更快的存取数据。

4 在哪些场景使用MongoDB

  • 大数据
  • 内容管理系统
  • 移动端Apps
  • 数据管理

MongoDB

目录

    • MongoDB介绍
    • MongoDB安装
    • MongoDB基本操作
      • 1.链接数据库
      • 2.CRUD 操作
      • 3.创建(Create)
      • 4.查找(Read)
      • 5.更新(Update)
      • 6.删除(Delete)
      • 7.导入json文件
      • 8.导出json文件
    • 每日一面
        • 1.什么是MongoDB
        • 2.MongoDB的优势有哪些
        • 3 为什么用MOngoDB?
        • 4 在哪些场景使用MongoDB

MongoDB介绍

关系型数据库:( 增 insert / 删 delete / 改 update / 查 select )
mysql sqlserver oracle db2 access
非关系型数据库
mongodb redis hbase

MongoDB是一个NoSQL数据库,它是跨平台的,基于分布式文件存储的数据库,由C++语言编写的(这点很重要,则表示在Linux下需要安装gcc环境)。MongoDB是以文档的形式存储数据,数据结构由键值(key:value)对组成,类似JSON。

MongoDB结构,最小的单位为文档(类似MySQL的行),每一个文档用的是BSON形式来存储(类似JSON),文档的上一层为集合(类似MySQL的表),再上一级为库(类似MySQL的数据库)。

简而言之,MongoDB是一个免费开源跨平台的 NoSQL 数据库,与关系型数据库不同,MongoDB 的数据以类似于 JSON 格式的二进制文档存储:

{name: "我没有三颗心脏",age: 22,
}

以使用我们熟悉的 MySQL 数据库来加以对比:

MySQL 基础概念MongoDB 对应概念
数据库(database)容器(database)
表(table)集合(collection)
行(row)文档(document)
列(column)域(filed)
索引(index)索引(index)

也借用一下菜鸟教程的图来更加形象生动的说明一下:

常用shell命令:

  1. show dbs; 查看数据库有哪些

  2. use DATABASE_NAME;如果数据库不存在,则创建数据库,否则切换到指定数据库。

  3. db.dropDatabase() 删除数据库

  4. db.createCollection(“runoob”); 创建数据库的集合名称

  5. show collections; 查看数据库里有多少个集合

  6. db.mycol2.insert({“name” : “菜鸟教程”}); 给 mycol2这个集合,插入一条数据

  7. db.collection.drop(); 删除一个集合

  8. db.teachers.insertOne({“name”:“wangdong”}); 插入一条数据

  9. db.teachers.insertMany([{“name”:“liu”},{“name”:“li”},{“name”:“wang”}]) 集合插入多天数据

  10. db.teachers.find() 查看teachers这个集合有多少条数据

    11.db.teachers.find().sort({“age”:-1}); 按照年龄排序,这个-1,是降序排列,1是升序排列。

MongoDB安装

MongoDB官网

  • mac下mongodb安装教程:
  • windows下mongodb安装教程:

下载 msi 文件,下载后双击该文件,按操作提示安装即可

安装过程中,你可以通过点击 “Custom(自定义)” 按钮来设置你的安装目录。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JZ61VeXL-1608902727843)(D:\积云\学习大纲\课件p333333\day12 MongoDB\day12 MongoDB\img\1.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SKuRPHES-1608902727846)(D:\积云\学习大纲\课件p333333\day12 MongoDB\day12 MongoDB\img\2.jpg)]

这里我选择的是自定义安装,选择你想安装到的位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NoPN8uJV-1608902727847)(D:\积云\学习大纲\课件p333333\day12 MongoDB\day12 MongoDB\img\9.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5DIsJz7F-1608902727848)(D:\积云\学习大纲\课件p333333\day12 MongoDB\day12 MongoDB\img\1599348990(1)].png)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bhhQ42Fz-1608902727849)(D:\积云\学习大纲\课件p333333\day12 MongoDB\day12 MongoDB\img\3.jpg)]

最后安装成功会弹出一个警告框,选中 Ignore 就好

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xo1iqlgy-1608902727851)(D:\积云\学习大纲\课件p333333\day12 MongoDB\day12 MongoDB\img\11.png)]

最后打开bin/mongod.cfg 文件,注释掉最后面的mp:,至此大功告成

启动mongodb

mongod --dbpath F:\MongoDB\data

接下来在浏览器中输入http://127.0.0.1:27017/,当出现下面那行字的时候就说明服务开起来了

It looks like you are trying to access MongoDB over HTTP on the native driver port.

配置mongod服务到winows启动命令中

(为了电脑启动时候数据库也是未启动,节省电脑内存和cpu,需要的时候启动)

  1. 在当前bin目录下启动cmd,运行下面命令(部分电脑需要以管理员身份运行cmd)
mongod --config "F:\MongoDB\bin\mongod.cfg" --install
  1. 右键我的电脑->管理->服务和应用程序->服务
  2. 找到MongoDB Server 改成手动启动,至此大功告成,以后需要mongdb数据库时候来这里手动启动就ok了

配置mongod服务全局shell启动入口

(为了在任何位置的cmd中都可以使用mongo操作)

  1. 此电脑右击->属性->高级系统设置-环境变量

  2. 点击系统变量中的新建

  3. 选中下面系统变量Path那一栏中点击编辑,新建,输入mongodb中bin目录的路径 // F:\MongoDB\bin

    上面如果已配置完成在任何地方可以使用mongo命令直接启动,如果上面未配置启动mongodb需要找到mongodb所在的路径点开bin目录 在地址栏输入cmd,执行mongo 即可

    注意:这里由于没有执行mongod,就直接执行mongo,这里会报错,不必担心,老师送上解决办法

    解决方式:
    1、先打开\bin 使用命令 mongod –dbpath指定db路径
    2、重新打开一个DOS再启动mongo
    

MongoDB基本操作

通过上面的步骤我们在系统里运行了一个 mongodb 实例,接下来通过 mongo 命令来连接它:

1.链接数据库

mongo 127.0.0.1:27017

mongo [options] [db address] [file names]

由于上面运行的 mongodb 运行在 27017 端口,并且灭有启动安全模式,所以我们也不需要输入用户名和密码就可以直接连接:

mongo 127.0.0.1:27017

或者通过 --host--port 选项指定主机和端口。一切顺利的话,就进入了 mongoDB shellshell 会报出一连串权限警告,不过不用担心,这并不会影响之后的操作。在添加授权用户和开启认证后,这些警告会自动消失。

2.CRUD 操作

在进行增删改查操作之前,我们需要先了解一下常用的 shell 命令:

  • db 显示当前所在数据库,默认为 test
  • show dbs 列出可用数据库
  • show tables show collections 列出数据库中可用集合
  • use newDatabase 用于切换数据库

mongoDB 预设有两个数据库,admin 和 local,admin 用来存放系统数据,local 用来存放该实例数据,在副本集中,一个实例的 local 数据库对于其它实例是不可见的。使用 use 命令切换数据库:

> use admin
> use local
> use newDatabase

可以 use 一个不存在的数据库,当你存入新数据时,mongoDB 会创建这个数据库:

> use newDatabase
> db.newCollection.insert({x:1})
WriteResult({ "nInserted" : 1 })

以上命令向数据库中插入一个文档,返回 1 表示插入成功,mongoDB 自动创建 newCollection 集合和数据库 newDatabase。下面将对增查改删操作进行一个简单的演示。

3.创建(Create)

MongoDB 提供 insert 方法创建新文档:

  • db.collection.inserOne() 插入单个文档
  • db.collection.inserMany() 插入多个文档
  • db.newDatabase.insert() 插入单条或多条文档

我们接着在刚才新创建的 newDatabase 下面新增数据吧:

db.newDatabase.insert({name:"wmyskxz",age:22})

根据以往经验应该会觉得蛮奇怪的,因为之前在这个集合中插入的数据格式是 {x:1} 的,而这里新增的数据格式确是 {name:"wmyskxz",age:22} 这个样子的。还记得吗,文档型数据库的与传统型的关系型数据的区别就是在这里!

并且要注意,age:22age:"22" 是不一样的哦,前者插入的是一个数值,而后者是字符串,我们可以通过 db.newCollection.find() 命令查看到刚刚插入的文档:

> db.newDatabase.find()
{ "_id" : ObjectId("5cc1026533907ae66490e46c"), "x" : 1 }
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz", "age" : 22 }

这里有一个神奇的返回,那就是多了一个叫做 _id 的东西,这是 MongoDB 为你自动添加的字段,你也可以自己生成。大部分情况下还是会让 MongoDB 为我们生成,而且默认情况下,该字段是被加上了索引的。

4.查找(Read)

MongoDB 提供 find 方法查找文档,第一个参数为查询条件:

  • db.newDatabase.find() 查找当前集合中的所有数据
  • db.collection.find({条件对象}) 将符合条件的数据查出来
  • db.collection.findOne() 查询到的第一个对象
  • db.collection.find().pretty() 将找到的数据已格式化的结果显示出来
> db.newDatabase.find() # 查找所有文档
{ "_id" : ObjectId("5cc1026533907ae66490e46c"), "x" : 1 }
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz", "age" : 22 }
> db.newDatabase.find({name:"wmyskxz"}) # 查找 name 为 wmyskxz 的文档
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz", "age" : 22 }
> db.newDatabase.find({age:{$gt:20}}) # 查找 age 大于 20 的文档
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz", "age" : 22 }

上述代码中的$gt对应于大于号>的转义。

第二个参数可以传入投影文档映射数据:

> db.newCollection.find({age:{$gt:20}},{name:1})
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz" }

上述命令将查找 age 大于 20 的文档,返回 name 字段,排除其他字段。投影文档中字段为 1 或其他真值表示包含,0 或假值表示排除,可以设置多个字段位为 1 或 0,但不能混合使用。

为了测试,我们为这个集合弄了一些奇奇怪怪的数据:

> db.newDatabase.find()
{ "_id" : ObjectId("5cc1026533907ae66490e46c"), "x" : 1 }
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz", "age" : 22 }
{ "_id" : ObjectId("5cc108fb33907ae66490e46e"), "name" : "wmyskxz-test", "age" : 22, "x" : 1, "y" : 30 }

然后再来测试:

> db.newCollection.find({age:{$gt:20}},{name:1,x:1}) 
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz" }
{ "_id" : ObjectId("5cc108fb33907ae66490e46e"), "name" : "wmyskxz-test", "x" : 1 }
> db.newCollection.find({age:{$gt:20}},{name:0,x:0}) 
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "age" : 22 }
{ "_id" : ObjectId("5cc108fb33907ae66490e46e"), "age" : 22, "y" : 30 }
> db.newCollection.find({age:{$gt:20}},{name:0,x:1})
Error: error: {"ok" : 0,"errmsg" : "Projection cannot have a mix of inclusion and exclusion.","code" : 2,"codeName" : "BadValue"
}

从上面的命令我们就可以把我们的一些想法和上面的结论得以验证,perfect!

除此之外,还可以通过 countskiplimit 等指针(Cursor)方法,改变文档查询的执行方式:

> db.newCollection.find().count()
3
> db.newCollection.find().skip(1).limit(10).sort({age:1})
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz", "age" : 22 }
{ "_id" : ObjectId("5cc108fb33907ae66490e46e"), "name" : "wmyskxz-test", "age" : 22, "x" : 1, "y" : 30 }

上述查找命令跳过 1 个文档,限制输出 10 个,以 age 子段正序排序(大于 0 为正序,小于 0 位反序)输出结果。最后,可以使用 Cursor 方法中的 pretty 方法,提升查询文档的易读性,特别是在查看嵌套的文档和配置文件的时候:

> db.newCollection.find().pretty()
{ "_id" : ObjectId("5cc1026533907ae66490e46c"), "x" : 1 }
{"_id" : ObjectId("5cc102fb33907ae66490e46d"),"name" : "wmyskxz","age" : 22
}
{"_id" : ObjectId("5cc108fb33907ae66490e46e"),"name" : "wmyskxz-test","age" : 22,"x" : 1,"y" : 30
}

5.更新(Update)

MongoDB 提供 update 方法更新文档:

  • db.collection.updateOne() 更新最多一个符合条件的文档
  • db.collection.updateMany() 更新所有符合条件的文档
  • db.collection.replaceOne() 替代最多一个符合条件的文档
  • db.newDatabase.update() 默认更新一个文档,可配置 multi 参数,跟新多个文档**

update() 方法为例。其格式:

> db.collection.update(<query>,<update>,{upsert: <boolean>,multi: <boolean>}
)

各参数意义:

  • query 为查询条件
  • update 为修改的文档
  • upsert 为真,查询为空时插入文档
  • multi 为真,更新所有符合条件的文档

下面我们测试把 name 字段为 wmyskxz 的文档更新一下试试:

> db.newCollection.update({name:"wmyskxz"},{name:"wmyskxz",age:30})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

要注意的是,如果更新文档只传入 age 字段,那么文档会被更新为{age: 30},而不是{name:"wmyskxz", age:30}。要避免文档被覆盖,需要用到 $set 指令,$set 仅替换或添加指定字段:

> db.newCollection.update({name:"wmyskxz"},{$set:{age:30}})

如果要在查询的文档不存在的时候插入文档,要把 upsert 参数设置真值:

> db.newCollection.update({name:"wmyskxz11"},{$set:{age:30}},{upsert:true})

update 方法默认情况只更新一个文档,如果要更新符合条件的所有文档,要把 multi 设为真值,并使用 $set 指令:

> db.newCollection.update({age:{$gt:20}},{$set:{test:"A"}},{multi:true})
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
> db.newCollection.find()
{ "_id" : ObjectId("5cc1026533907ae66490e46c"), "x" : 1 }
{ "_id" : ObjectId("5cc102fb33907ae66490e46d"), "name" : "wmyskxz", "age" : 30, "test" : "A" }
{ "_id" : ObjectId("5cc108fb33907ae66490e46e"), "name" : "wmyskxz-test", "age" : 22, "x" : 1, "y" : 30, "test" : "A" }
{ "_id" : ObjectId("5cc110148d0a578f03d43e81"), "name" : "wmyskxz11", "age" : 30, "test" : "A" }

6.删除(Delete)

MongoDB 提供了 delete 方法删除文档:

  • db.collection.deleteOne() 删除最多一个符合条件的文档
  • db.collection.deleteMany() 删除所有符合条件的文档
  • db.newDatabase.remove() 删除一个或多个文档

以 remove 方法为例:

> db.newCollection.remove({name:"wmyskxz11"})
> db.newCollection.remove({age:{$gt:20}},{justOne:true})
> db.newCollection.find()
{ "_id" : ObjectId("5cc1026533907ae66490e46c"), "x" : 1 }
{ "_id" : ObjectId("5cc108fb33907ae66490e46e"), "name" : "wmyskxz-test", "age" : 22, "x" : 1, "y" : 30, "test" : "A" }

MongoDB 提供了 drop 方法删除集合,返回 true 表面删除集合成功:

> db.newCollection.drop()

7.导入json文件

我这里是已经创建好了数据库test,如果你要新建数据库,直接use test,是创建不成功的,需要插入一条数据。db.user.insert({name:"xiaoming",age:23})

命令:

mongoimport --db test --collection user --file C:\Users\zhang_zk\Desktop\new.json

说明:
1.进入你电脑的mongobd安装的bin目录。
2.执行mongoimport的命令。
test:数据库名
user:集合名
C:\Users\zhang_zk\Desktop\new.json   :你的json文件的路径

8.导出json文件

mongoexport -d 数据库名 -c collections的名字 -o filename.json/filename.csv -f field 参数

说明:
1. -d   数据库名(database)
2. -c   collections名
3. -o   要存入的文件名(xxx.json/xxx.csv)
4. -f   输出特定属性列(一般情况下可以不加这个参数)

例子:

每日一面

1.什么是MongoDB

MongoDB是一个文档数据库,提供好的性能,领先的非关系型数据库。采用BSON存储文档数据。
BSON()是一种类json的一种二进制形式的存储格式,简称Binary JSON.
相对于json多了date类型和二进制数组。

2.MongoDB的优势有哪些

  • 面向文档的存储:以 JSON 格式的文档保存数据。
  • 任何属性都可以建立索引。
  • 复制以及高可扩展性。
  • 自动分片。
  • 丰富的查询功能。
  • 快速的即时更新。

3 为什么用MOngoDB?

  • 架构简单
  • 没有复杂的连接
  • 深度查询能力,MongoDB支持动态查询。
  • 容易调试
  • 容易扩展
  • 不需要转化/映射应用对象到数据库对象
  • 使用内部内存作为存储工作区,以便更快的存取数据。

4 在哪些场景使用MongoDB

  • 大数据
  • 内容管理系统
  • 移动端Apps
  • 数据管理
发布评论

评论列表 (0)

  1. 暂无评论