MongoDB数据库简单操作,MongoDB的简单操作

之前学过的有mysql数据库,现在我们学习一种非关系型数据库

一、简介

一、Mongodb

https://www.mongodb.com/
官网

我是mac电脑,所以我采用homebrew安装Mongodb

  • $ brew update

  • To install the MongoDB binaries, issue the following command in a
    system shell:
    $ brew install mongodb
  • To install the MongoDB binaries that have TLS/SSL support, issue the
    following from a system shell:
    $ brew install mongodb –with-openssl
  • To install the latest development release for use in testing and
    development, issue the following command in a system shell:
    $ brew install mongodb –devel

  • 在电脑的/usr/local/etc/mongod.conf 里可以设置bindIp:
    127.0.0.1意思是本机访问,如果是外网访问需要在这重新设置

  • 第一步先连接数据库,打开终端进入一个文件夹执行下面命令:
    $ mongod –dbpath 路径(如果是空文件夹会自动创建数据库)
    连接完成后可以通过http访问该数据库,mongodb默认使用了27017端口,因此在浏览器中打开http://localhost:27017可以显示一段英文表示连接成功。

一、简介

MongoDB是一款强大、灵活、且易于扩展的通用型数据库

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

在高负载的情况下,添加更多的节点,可以保证服务器性能。

MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB
将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB
文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

 

1、易用性

MongoDB是由C++编写的,是一个基于分布式文件存储的开源数据库系统,它不是关系型数据库。在高负载的情况下,添加更多的节点,可以保证服务器的性能。

图片 1

MongoDB是一个面向文档(document-oriented)的数据库,而不是关系型数据库。不采用关系型主要是为了获得更好得扩展性。当然还有一些其他好处,与关系数据库相比,面向文档的数据库不再有“行“(row)
的概念取而代之的是更为灵活的“文档”(document)模型。通过在文档中嵌入文档和数组,面向文档的方法能够仅使用一条记录
来表现复杂的层级关系,这与现代的面向对象语言的开发者对数据的看法一致。

另外,不再有预定义模式(predefined schema):文档的键(key)和值(value)不再是固定的类型和大小
。由于没有固定的模式,根据需要添加或删除字段变得更容易了。通常由于开发者能够进行快速迭代,所以开发进程得以加快。
而且,实验更容易进行。开发者能尝试大量的数据模型,从中选一个最好的。

图片 2

 

卓越的性能

图片 3

MongoDB的一个主要目标是提供卓越的性能,这很大程度上决定了MongoDB的设计。MongoDB把尽可能多的内存用作缓存cache,
视图为每次查询自动选择正确的索引。总之各方面的设计都旨在保持它的高性能虽然MongoDB非常强大并试图保留关系型数据库的很多特性,但它并不追求具备关系型数据库的所有功能。
只要有可能,数据库服务器就会将处理逻辑交给客户端
。这种精简方式的设计是MongoDB能够实现如此高性能的原因之一

图片 4

 

 

 

二、MongoDB基础知识

图片 5

1、文档是MongoDB的核心概念。文档就是键值对的一个有序集{‘msg’:’hello’,’foo’:3}。类似于python中的有序字典

需要注意的是:#1、文档中的键/值对是有序的。#2、文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。#3、MongoDB区分类型和大小写。#4、MongoDB的文档不能有重复的键。#5、文档中的值可以是多种不同的数据类型,也可以是一个完整的内嵌文档。文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。文档键命名规范:#1、键不能含有\0 (空字符)。这个字符用来表示键的结尾。#2、.和$有特别的意义,只有在特定环境下才能使用。#3、以下划线"_"开头的键是保留的(不是严格要求的)。

 

 

2、集合就是一组文档。如果将MongoDB中的一个文档比喻为关系型数据的一行,那么一个集合就是相当于一张表

图片 6

#1、集合存在于数据库中,通常情况下为了方便管理,不同格式和类型的数据应该插入到不同的集合,但其实集合没有固定的结构,
这意味着我们完全可以把不同格式和类型的数据统统插入一个集合中。#2、组织子集合的方式就是使用“.”,分隔不同命名空间的子集合。比如一个具有博客功能的应用可能包含两个集合,分别是blog.posts和blog.authors,这是为了使组织结构更清晰,
这里的blog集合(这个集合甚至不需要存在)跟它的两个子集合没有任何关系。在MongoDB中,使用子集合来组织数据非常高效,值得推荐#3、当第一个文档插入时,集合就会被创建。合法的集合名:集合名不能是空字符串""。集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。集合名不能以"system."开头,这是为系统集合保留的前缀。用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。
除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。

图片 7

3、数据库:在MongoDB中,多个文档组成集合,多个集合可以组成数据库

图片 8

数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串:#1、不能是空字符串("")。#2、不得含有' '(空格)、.、$、/、\和\0 (空字符)。#3、应全部小写。#4、最多64字节。有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。#1、admin: 从身份认证的角度讲,这是“root”数据库,如果将一个用户添加到admin数据库,这个用户将自动获得所有数据库的权限。再者,一些特定的服务器端命令也只能从admin数据库运行,如列出所有数据库或关闭服务器#2、local: 这个数据库永远都不可以复制,且一台服务器上的所有本地集合都可以存储在这个数据库中#3、config: MongoDB用于分片设置时,分片信息会存储在config数据库

图片 9

4、强调:把数据库名添加到集合名前,得到集合的完全限定名,即命名空间

例如:如果要使用cms数据库中的blog.posts集合,这个集合的命名空间就是cms.blog.posts。命名空间的长度不得超过121个字节,且在实际使用中应该小于100个字节

图片 10

二、MongoDB基础知识

注意:一般我们数据库都设置登录密码,上一步可以这么执行

$ mongod –dbpath 路径 –port 20000 –auth
设置了端口号为20000,并设置了需要auth权限,下面就得设置权限了
用户管理员的角色名叫 userAdminAnyDatabase,这个角色只能在 admin
数据库中创建。按下面执行:
$ use admin
$
db.createUser({user:”root”,pwd:”root123″,roles:[“userAdminAnyDatabase”]})
这个例子创建了一个名为 root
的用户管理员,用户名和密码可以随意,创建完了这个用户之后,我们应该马上以该用户的身份登录:
$ db.auth(“root”,”root123″)
db.auth(“root”,”root123″) 方法返回 1
表示登录成功。接下来我们为指定的数据库创建访问所需的账号(一定要)

  • 首先保证你已经以用户管理员的身份登录 admin 数据库。然后用 use
    命令切换到目标数据库,同样用 db.createUser()
    命令来创建用户,其中角色名为 “readWrite”。
    $ use test (这里创建了一个test集合)
    //为这个集合创建权限密码
    $
    db.createUser({user:”testuser”,pwd:”testpass”,roles:[“readWrite”]})
    $ db.auth(“testuser”,”testpass”) // 返回1

  • 再打开个终端,前一个终端不能关闭,使用数据库语法要先执行这个: $
    mongo

注意:如果连接没设定–port端口号默认是27017端口,只需要$
mongo命令就可以开启mongo语法,
但是设定了端口号的话,使用$ mongo –port 20000开启mongo语法,
如果还有集合密码的话就输入
$ mongo –port 20000 -u testuser -p testpass
这里指定了连接的端口和权限密码
具体可以 $ mongo –help查看
如果连接远程数据库 换成 $ mongo 远程IP地址:端口号 -u 用户名 -p 密码

注意没有读写权限,加权限sudo chown 那个文件夹目录,开启读写权限
列出所有数据库:$ show dbs

  • 使用数据库:$ use 数据库名字 (use一个不存在的数据库就相当于新建)
    想查看当前在哪个数据库里:$ db
    插入数据: $
    db.student.insert({“name”:”xiaoming”,”age”:12,”sex”:”man”});

基本数据类型:

图片 11图片 12

基于BSON结构 string  字符串,Utf8 integer 整型 double 双精度,包含float,MongoDB中不存在Float Null 空数据类型 Date 时间类型 ISODate(2018-9-12 10:45:58) Timestamp 时间戳类型 ISODate("123123")  ObjectId 对象ID Documents 自生成的 _id ObjectId("5b98794ec34b9812bcabdde7")    #"5b151f85"  代指的是时间戳,这条数据的产生时间    #"364098"   代指某台机器的机器码,存储这条数据时的机器编号    #"09ab"   代指进程ID,多进程存储数据的时候,非常有用的    #"2e6b26"   代指计数器,这里要注意的是,计数器的数字可能会出现重复,不是唯一的    #以上四种标识符拼凑成世界上唯一的ObjectID    #只要是支持MongoDB的语言,都会有一个或多个方法,对ObjectID进行转换    #可以得到以上四种信息

基本数据类型

 

三、安装

student就是所谓的集合。集合中存储着很多json,student是第一次使用,集合将自动创建。

显示集合:$ show collections
$ db.student.find(); 显示集合内容

 

四、基本数据类型

我们不可能一条一条的insert。所以,我们希望用sublime在外部写好数据库的形式,然后导入数据库:

$ mongoimport –db test –collection restaurants –drop –file aa.json
–db test 想往哪个数据库里面导入
–collection restaurants 想往哪个集合中导入
–drop 把集合清空
–file aa.json 哪个文件
这样,我们就能用sublime创建一个json文件,然后用mongoimport命令导入,这样学习数据库非常方便。

删除当前所在的数据库:$ db.dropDatabase();

图片 13

1.png

三、安装

 

 

(此处说的是windows的)

下载好mongoDB之后,选择文件夹安装
,然后配置环境变量,就是把你的环境变量配置到电脑上,然后你需要再建立一个文件夹用来存放mpongodb的数据库

图片 14

 

 

安装目录: D:\MongoDB 然后找到bin目录加入到电脑的环境变量种 然后再创建一个目录用来存放你的数据库    D:\MongoDB\data\db目录一半都是创建data\db然后这个时候用你的管理员的身份来运行cmd然后切换到你的 新建立的存放数据库的文件夹下:D:\MongoDB\data\db 然后执行 mongod --dbpath +你的文件夹路径 mongod --dbpath D:\MongoDB\data\db 就把你的数据库连接打开了 然后你就可以通过其他连接 进行与你的mongodb数据库连接了(切忌:上一次的和数据库的链接不可以断开 就是选定的链接文件夹和数据库相连接)

 

选好安装目录
D:\MongoDB
选择数据库存放目录
D:\MongoDB\data\db
以管理员身份运行
mongod --dbpath D:\MongoDB\data\db

 

然后再次打开新的连接   上次的链接不可以断开 需要再次打开新的链接进行数据库访问

 

 

2、账号管理

 

图片 15

#账号管理:https://docs.mongodb.com/master/tutorial/enable-authentication/#1、创建有权限的用户

  use admin
  db.createUser(
    { 
      user: “root”, #这个root可以随便写
      pwd: “123”, 
      roles: [ { role: “root”, db: “admin” } ]
#权限,role是root说明是管理员,
    }
  )

  use test
  db.createUser(
    {
      user: “egon”,
      pwd: “123”, 
      roles: [ { role: “readWrite”, db: “test” },
#针对test库有读写权限,操作自己的库有读写权限
      { role: “read”, db: “db1” } ]
#针对db1库读权限,操作其他库有读权限
    }
  )

#2、重启数据库mongod --removemongod --config "C:\mongodb\mongod.cfg" --bind_ip 0.0.0.0 --install --auth
或者
mongod --bind_ip 0.0.0.0 --port 27017 --logpath D:\MongoDB\log\mongod.log --logappend --dbpath
D:\MongoDB\data\db --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install --auth#3、登录:注意使用双引号而非单引号mongo --port 27017 -u "root" -p "123" --authenticationDatabase "admin"也可以在登录之后用db.auth("账号","密码")登录mongouse admindb.auth("root","123")#推荐博客:https://www.cnblogs.com/zhoujinyi/p/4610050.html创建账号密码+开启认证机制

图片 16

 

 

 

 

数据库的连接工具:

链接:

 

简单操作:

图片 17

 

 

以上是一个简单的连接工具,就是先连接本机的数据库
也可以选择连接其他ip地址的数据库(仅仅限于mongoDB数据库)

 

 

在mongodb种数据库还是数据库的含义,但是表的定义没有了,叫集合(其实还是表)

基本数据类型

1、在概念上,MongoDB的文档与Javascript的对象相近,因而可以认为它类似于JSON。JSON
id=”code_img_closed_27e56e01-702e-4614-86ed-3cbb9a0ce57c”
src=””
alt=””
/>图片 18

 1 #1、null:用于表示空或不存在的字段 2 d={'x':null} 3 #2、布尔型:true和false 4 d={'x':true,'y':false} 5 #3、数值 6 d={'x':3,'y':3.1415926} 7 #4、字符串 8 d={'x':'egon'} 9 #5、日期10 d={'x':new Date()}11 d.x.getHours()12 #6、正则表达式13 d={'pattern':/^egon.*?nb$/i}14 15 正则写在//内,后面的i代表:16 i 忽略大小写17 m 多行匹配模式18 x 忽略非转义的空白字符19 s 单行匹配模式20 21 #7、数组22 d={'x':[1,'a','v']}23 24 #8、内嵌文档25 user={'name':'egon','addr':{'country':'China','city':'YT'}}26 user.addr.country27 28 #9、对象id:是一个12字节的ID,是文档的唯一标识,不可变29 d={'x':ObjectId()}

数据类型

 

 

6、_id和ObjectId

图片 19图片 20

1 MongoDB中存储的文档必须有一个"_id"键。这个键的值可以是任意类型,默认是个ObjectId对象。 2 在一个集合里,每个文档都有唯一的“_id”,确保集合里每个文档都能被唯一标识。 3 不同集合"_id"的值可以重复,但同一集合内"_id"的值必须唯一 4 5 #1、ObjectId 6 ObjectId是"_id"的默认类型。因为设计MongoDb的初衷就是用作分布式数据库,所以能够在分片环境中生成 7 唯一的标识符非常重要,而常规的做法:在多个服务器上同步自动增加主键既费时又费力,这就是MongoDB采用 8 ObjectId的原因。 9 ObjectId采用12字节的存储空间,是一个由24个十六进制数字组成的字符串10  0|1|2|3| 4|5|6|  7|8 9|10|11 11  时间戳  机器  PID 计数器12 如果快速创建多个ObjectId,会发现每次只有最后几位有变化。另外,中间的几位数字也会变化(要是在创建过程中停顿几秒)。13 这是ObjectId的创建方式导致的,如上图14 15 时间戳单位为秒,与随后5个字节组合起来,提供了秒级的唯一性。这个4个字节隐藏了文档的创建时间,绝大多数驱动程序都会提供16 一个方法,用于从ObjectId中获取这些信息。17 18 因为使用的是当前时间,很多用户担心要对服务器进行时钟同步。其实没必要,因为时间戳的实际值并不重要,只要它总是不停增加就好。19 接下来3个字节是所在主机的唯一标识符。通常是机器主机名的散列值。这样就可以保证不同主机生成不同的ObjectId,不产生冲突20 21 接下来连个字节确保了在同一台机器上并发的多个进程产生的ObjectId是唯一的22 23 前9个字节确保了同一秒钟不同机器不同进程产生的ObjectId是唯一的。最后3个字节是一个自动增加的 计数器。确保相同进程的同一秒产生的24 ObjectId也是不一样的。25 26 #2、自动生成_id27 如果插入文档时没有"_id"键,系统会自帮你创建 一个。可以由MongoDb服务器来做这件事。28 但通常会在客户端由驱动程序完成。这一做法非常好地体现了MongoDb的哲学:能交给客户端驱动程序来做的事情就不要交给服务器来做。29 这种理念背后的原因是:即便是像MongoDB这样扩展性非常好的数据库,扩展应用层也要比扩展数据库层容易的多。将工作交给客户端做就30 减轻了数据库扩展的负担。

_id 和objectid

 

五、增删改查操作

查找数据

列出这个集合的所有文档:
$ db.restaurants.find()
精确匹配
$ db.student.find({“score.shuxue”:70});
多个条件:
$ db.student.find({“score.shuxue”:70 , “age”:12})
大于条件:
$ db.student.find({“score.yuwen”:{$gt:50}});
寻找所有年龄是9岁,或者11岁的学生
$ db.student.find({$or:[{“age”:9},{“age”:11}]});
查找完毕之后,打点调用sort,表示升降排序。
$ db.restaurants.find().sort( { “borough”: 1, “address.zipcode”: 1 } )

五、增删改查操作

增删改查:

 

增: - db.user.info #user.info表 - db.user #user表 - db.user.auth ##user.auth表  当第一个文档插入时,集合就会被创建  > use database1  switched to db database1  > db.table1.insert({'a':1})  WriteResult({ "nInserted" : 1 })  > db.table2.insert({'b':2})  WriteResult({ "nInserted" : 1 })查: - show collections - show tables #这两个是一样的 #只要是空不显示删: - db.user.info.help() #查看帮助 - db.user.info.drop()

 

 

 

1、数据库的增:

 

增加数据库: use +数据库名 # 有则切换无则新增 当你用use 创建完之后,你需要在insert之后才能显示出这个数据库 db.创建的数据库名.insertOne() eg: db.db.insertOne() 然后就会显示出你所创建的数据库 或者你直接使用db.创建的数据库名.insertOne()然后也可以直接创建出数据库

 

mongodb数据库的操作不论事增、删、改、查
都是需要用到db.你的数据的名然后再加上要操作的内容

你使用use创建的只是数据库
而当你插入第一条数据的时候你的集合就会被创建

 

 

 

创建数据库 use+数据库名 有则切换 无则创建
查看服务器中的所有的数据库 show  dbs  
db 查看当前所在的数据库  
show tables  查看当前数据库的中的集合  

 

六、可视化工具

修改数据

查找名字叫做小明的,把年龄更改为16岁:
$ db.student.update({“name”:”小明”},{$set:{“age”:16}});
查找数学成绩是70,把年龄更改为33岁:
$ db.student.update({“score.shuxue”:70},{$set:{“age”:33}});
更改所有匹配项目:”
By default, the update() method updates a single document. To update
multiple documents, use the multi option in the update() method.
$ db.student.update({“sex”:”男”},{$set:{“age”:33}},{multi: true});
完整替换,不出现$set关键字了:
$ db.student.update({“name”:”小明”},{“name”:”大明”,”age”:16});

1、集合的增加insert

 

增加 db.test.insert({"name":"老王"}) 这个是对你的数据中插入一个集合为test的数据
多行增加 db.test.insert([{"name":"隔壁老王"},{"hobby":"找人"}]) 对你的数据库中的test集合插入两条数据 
     
单行增加 db.db.inertOne({"name":"隔壁老王"})  为你的数据中插入一个集合为db的数据 
多行插入 d.db.insertMany([{"name":"隔壁老王"},{"name":"你媳妇"}])  为你的数据库中插入一个集合 db,db集合中有两条数据 
     

增:

图片 21图片 22

#1、没有指定_id则默认ObjectId,_id不能重复,且在插入后不可变 2 3 #2、插入单条 4 user0={ 5  "name":"egon", 6  "age":10, 7  'hobbies':['music','read','dancing'], 8  'addr':{ 9   'country':'China',10   'city':'BJ'11  }12 }13 14 db.test.insert(user0)15 db.test.find()16 17 #3、插入多条18 user1={19  "_id":1,20  "name":"alex",21  "age":10,22  'hobbies':['music','read','dancing'],23  'addr':{24   'country':'China',25   'city':'weifang'26  }27 }28 29 user2={30  "_id":2,31  "name":"wupeiqi",32  "age":20,33  'hobbies':['music','read','run'],34  'addr':{35   'country':'China',36   'city':'hebei'37  }38 }39 40 41 user3={42  "_id":3,43  "name":"yuanhao",44  "age":30,45  'hobbies':['music','drink'],46  'addr':{47   'country':'China',48   'city':'heibei'49  }50 }51 52 user4={53  "_id":4,54  "name":"jingliyang",55  "age":40,56  'hobbies':['music','read','dancing','tea'],57  'addr':{58   'country':'China',59   'city':'BJ'60  }61 }62 63 user5={64  "_id":5,65  "name":"jinxin",66  "age":50,67  'hobbies':['music','read',],68  'addr':{69   'country':'China',70   'city':'henan'71  }72 }73 db.user.insertMany([user1,user2,user3,user4,user5])

 

 

七、pymongo

删除数据

$ db.restaurants.remove( { “borough”: “Manhattan” } )

2、集合的删

删:db.dropDatabase() #db.user.drop() #删除user集合

db.user.remove({})
// remove 方式 被官方不推荐了
db.user.deleteOne({“name”:”白虎”})
db.user.deleteMany({“name”:”翠花儿”})

 

 

1 #1、删除多个中的第一个2 db.user.deleteOne({ 'age': 8 })3 4 #2、删除国家为China的全部 这个是删除你的所有的满足条件的5 db.user.deleteMany( {'addr.country': 'China'} ) 6 7 #3、删除全部8 db.user.deleteMany({})

 

 

可视化工具

链接:

 

 


By default, the remove() method removes all documents that match the remove condition. Use the justOne option to limit the remove operation to only one of the matching documents.

$ db.restaurants.remove( { “borough”: “Queens” }, { justOne: true } )

图片 23

屏幕快照 2017-09-10 上午2.35.49.png

3、查 find

db.+集合名.find() #查看这个集合内部的所有内容db.test.find() #查看test集合中的所有内容根据条件查找db.test.find(条件)db.test.find("name":"老王") #查找test集合中的name是老王的信息findOne() 查找单行db.one.findOne({"name":"老王",age:1}) 逗号代表and

 

 

 

数字比较符:

$lt 
小于
$gt
大于
$lte 
小于等于
$gte
大于等于

 

$and  和
$or 或者
$not 不是
$mod 取模运算

 

 

$gt 大于db.test.findOne({"id":{$gt:1}}) 求集合test中id大于1的信息
$lt 小于
db.test.findOne({"id":{$lt:5}}) 集合test中id小于5的信息
$lte小于等于
db.test.findOne({"id":{$lte:3}}) 集合test中id小于等于5的信息
$gte 大于等于

 db.user.find({  "_id":{"$gte":3,"$lte":4},  "age":{"$gte":40} #结束就不要加逗号了 })
$and # 并列查询 以逗号分隔

db.user.find({"$and":[  {"_id":{"$gte":3,"$lte":4}}, #一个字典就是一个条件  {"age":{"$gte":40}} ]}

select * from db1.user where id >=0 and id <=1 or id >=4 or name = "yuanhao"; db.user.find({"$or":[ {"_id":{"$lte":1,"$gte":0}}, {"_id":{"$gte":4}}, {"name":"yuanhao"} ]})

 select * from db1.user where id % 2 = 1; #奇数 db.user.find({"_id":{"$mod":[2,1]}}) #取模运算,id对2取模 #取反,偶数 db.user.find({  "_id":{"$not":{"$mod":[2,1]}} })

 

 

$in 在里面
$nin 不在
   

 

# SQL:in,not in2 # MongoDB:"$in","$nin"3 4 #1、select * from db1.user where age in (20,30,31);5 db.user.find({"age":{"$in":[20,30,31]}})6 7 #2、select * from db1.user where name not in ('huahua','xxx');8 db.user.find({"name":{"$nin":['hauhua','xxx']}})

 

$in: db.user.find({age:{$in:[1,2,3]}}) 字段符合in,array中的数值$or: db.user.find({$or:[{age:{$in:[1,2,3,4]}},{name:666}]})$all: db.user.find({test:{$all:[1,2]}}) array元素相同即可 或 包含所有$all中的元素

 

 

 

 

改:update

图片 24图片 25

1 update() 方法用于更新已存在的文档。语法格式如下: 2 db.collection.update( 3 <query>, 4 <update>, 5 { 6  upsert: <boolean>, 7  multi: <boolean>, 8  writeConcern: <document> 9 }10 )11 参数说明:对比update db1.t1 set name='EGON',sex='Male' where name='egon' and age=18;12 13 query : 相当于where条件。14 update : update的对象和一些更新的操作符(如$,$inc...等,相当于set后面的15 upsert : 可选,默认为false,代表如果不存在update的记录不更新也不插入,设置为true代表插入。16 multi : 可选,默认为false,代表只更新找到的第一条记录,设为true,代表更新找到的全部记录。17 writeConcern :可选,抛出异常的级别。18 19 更新操作是不可分割的:若两个更新同时发送,先到达服务器的先执行,然后执行另外一个,不会破坏文档。

updat语法介绍

 

 

$set : 将某个key的value 修改为 某值 $unset: 删除字段 {$unset: {test: "" }}  $inc:{$inc:{"age":100}} 原有值基础上增加 xxx  array: $push : 向数组Array最后位置插入一条元素 {$push:{"hobby":1234}} [].append(1234) $pull : 删除数组中的某一个元素 {$pull:{"hobby":123}}    #删除字典 db.user.updateOne({"_id":ObjectId("5b98794ec34b9812bcabdde7"),"hobby.age":18},{$unset:{"hobby.$":1}})  $pop : 删除数组的第一个或最后一个   最后一个:{$pop:{"hobby":1}}   第一个:{$pop:{"hobby":-1}}    $ :代指符合条件的某数据 array.$ :  db.user.updateOne({"_id":ObjectId("5b98794ec34b9812bcabdde7"),"hobby.name":"翠花儿"},{$set:{"hobby.$.name":"农妇山泉"}})
                                                         后面条件的$带表指的是前面的条件 就是告诉你要修改的是前面的条件

 

 

 

update修改:

updateOne 修改单条db.test.updateOne({"name":"隔壁小姑娘"},{"name":"操场小妹妹"})updateMany #修改多条数据

 

一、简介

Node.js操作MongoDB

需要引包:$ npm install mongodb

修改器:$set

 

$set 讲某个key的value修改为某值
$unset 删除字段 {$unset: {test: "" }}
$inc 在原值上增加
$push 向数组Array最后位置插入一条元素
$pull 删除数组中的某一个元素
$pop  删除数组的第一个或最后一个  
$ 单独使用代指的是你的条件
   

 

db.test.update({"name":"操场小妹妹"},{"$set":{"name":"属于你的妹子"}}) 修改修改单挑数据

 db.user.updateOne({“name”:”子龙”},{$set:{“name”:”赵子龙”}})

修改多条数据
 db.user.updateMany({“name”:”小青龙”},{$set:{“name”:”白虎”}})

 

 

MongoDB是一款强大、灵活、且易于扩展的通用型数据库

混搭:

 排序 跳过 显示条目sort 排序 find().sort(id:-1/1) 1 升序 2 降序 descskip 跳过 find().skip(2) 从三条开始返回limit 显示条目 find().limit(2)只显示前两条混搭:db.user.find({}).sort({age:-1 }).skip(1).limit(2)根据age字段进行降序排列,并且跳过第一条,从第二条开始返回,两条数据

 

MongoDB
是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

在python中上面的deleteone 都会变成delte_one 都会变成下划线之类的

res = mongo_db.user.find_one({"_id":ObjectId("5b98794ec34b9812bcabdde7")})查找单条的数据res = mongo_db.content.insert_one({"name":"123"}) 插入单条res = mongo_db.content.update_one({"name":"123"},{"$set":{"name":"666"}}) 修改单条修改多条res = mongo_db.content.update_many({"name":"666"},{"$set":{"name":"123"}})

 

 

在高负载的情况下,添加更多的节点,可以保证服务器性能。

 

MongoDB
旨在为WEB应用提供可扩展的高性能数据存储解决方案。

mondoDB和python的连接:

 

 

首先要先安装pymongo 模块

pip3 install pymongo

 

python和mongodb数据库连接

.MongoDB的默认端口号:27017  (redis:6379 MySql:3306)

mclient = pymongo.MongoClient(host="127.0.0.1", port=27017) #端口号和地址mongo_db = mclient[数据库]========

client=MongoClient('mongodb://root:123@localhost:27017')table=client['db1']['emp']

 

MongoDB
将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB
文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

MongoDB的特点:

1、易用性

MongoDB是由C++编写的,是一个基于分布式文件存储的开源数据库系统,它不是关系型数据库。在高负载的情况下,添加更多的节点,可以保证服务器的性能。

MongoDB是一个面向文档(document-oriented)的数据库,而不是关系型数据库。
不采用关系型主要是为了获得更好得扩展性。当然还有一些其他好处,与关系数据库相比,面向文档的数据库不再有“行“(row)
的概念取而代之的是更为灵活的“文档”(document)模型。通过在文档中嵌入文档和数组,面向文档的方法能够仅使用一条记录
来表现复杂的层级关系,这与现代的面向对象语言的开发者对数据的看法一致。

另外,不再有预定义模式(predefined schema):文档的键(key)和值(value)不再是固定的类型和大小
。由于没有固定的模式,根据需要添加或删除字段变得更容易了。通常由于开发者能够进行快速迭代,所以开发进程得以加快。
而且,实验更容易进行。开发者能尝试大量的数据模型,从中选一个最好的。

 

2、易扩展性

应用程序数据集的大小正在以不可思议的速度增长。随着可用带宽的增长和存储器价格的下降,即使是一个小规模的应用程序,需要存储的数据量也可能大的惊人,甚至超出
了很多数据库的处理能力。过去非常罕见的T级数据,现在已经是司空见惯了。
由于需要存储的数据量不断增长,开发者面临一个问题:应该如何扩展数据库,分为纵向扩展和横向扩展,纵向扩展是最省力的做法,但缺点是大型机一般都非常贵,而且
当数据量达到机器的物理极限时,花再多的钱也买不到更强的机器了,此时选择横向扩展更为合适,但横向扩展带来的另外一个问题就是需要管理的机器太多。
MongoDB的设计采用横向扩展。面向文档的数据模型使它能很容易地在多台服务器之间进行数据分割。MongoDB能够自动处理跨集群的数据和负载,自动重新分配文档,
以及将用户的请求路由到正确的机器上。这样,开发者能够集中精力编写应用程序,而不需要考虑如何扩展的问题。
如果一个集群需要更大的容量,只需要向集群添加新服务器,MongoDB就会自动将现有的数据向新服务器传送

3、丰富的功能

MongoDB作为一款通用型数据库,除了能够创建、读取、更新和删除数据之外,还提供了一系列不断扩展的独特功能
#1、索引
支持通用二级索引,允许多种快速查询,且提供唯一索引、复合索引、地理空间索引、全文索引

#2、聚合
支持聚合管道,用户能通过简单的片段创建复杂的集合,并通过数据库自动优化

#3、特殊的集合类型
支持存在时间有限的集合,适用于那些将在某个时刻过期的数据,如会话session。类似地,MongoDB也支持固定大小的集合
,用于保存近期数据,如日志

#4、文件存储
支持一种非常易用的协议,用于存储大文件和文件元数据。MongoDB并不具备一些在关系型数据库中很普遍的功能,
如链接join和复杂的多行事务。省略
这些的功能是处于架构上的考虑,或者说为了得到更好的扩展性,因为在分布式系统中这两个功能难以高效地实现

 

4、卓越的性能

MongoDB的一个主要目标是提供卓越的性能,这很大程度上决定了MongoDB的设计。MongoDB把尽可能多的内存用作缓存cache,
视图为每次查询自动选择正确的索引。
总之各方面的设计都旨在保持它的高性能
虽然MongoDB非常强大并试图保留关系型数据库的很多特性,但它并不追求具备关系型数据库的所有功能。
只要有可能,数据库服务器就会将处理逻辑交给客户端
。这种精简方式的设计是MongoDB能够实现如此高性能的原因之一

 

二、MongoDB基础知识

图片 5

1、文档是MongoDB的核心概念。文档就是键值对的一个有序集{‘msg’:’hello’,’foo’:3}。类似于python中的有序字典。

需要注意的是:
#1、文档中的键/值对是有序的。
#2、文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
#3、MongoDB区分类型和大小写。
#4、MongoDB的文档不能有重复的键。
#5、文档中的值可以是多种不同的数据类型,也可以是一个完整的内嵌文档。文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:
#1、键不能含有\0 (空字符)。这个字符用来表示键的结尾。
#2、.和$有特别的意义,只有在特定环境下才能使用。
#3、以下划线"_"开头的键是保留的(不是严格要求的)。

2、集合就是一组文档。如果将MongoDB中的一个文档比喻为关系型数据的一行,那么一个集合就是相当于一张表

#1、集合存在于数据库中,通常情况下为了方便管理,不同格式和类型的数据应该插入到不同的集合,但其实集合没有固定的结构,
这意味着我们完全可以把不同格式和类型的数据统统插入一个集合中。

#2、组织子集合的方式就是使用“.”,分隔不同命名空间的子集合。
比如一个具有博客功能的应用可能包含两个集合,分别是blog.posts和blog.authors,这是为了使组织结构更清晰,
这里的blog集合(这个集合甚至不需要存在)跟它的两个子集合没有任何关系。
在MongoDB中,使用子集合来组织数据非常高效,值得推荐

#3、当第一个文档插入时,集合就会被创建。合法的集合名:
集合名不能是空字符串""。
集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
集合名不能以"system."开头,这是为系统集合保留的前缀。
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。
除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。

3、数据库:在MongoDB中,多个文档组成集合,多个集合可以组成数据库

数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串:
#1、不能是空字符串("")。
#2、不得含有' '(空格)、.、$、/、\和\0 (空字符)。
#3、应全部小写。
#4、最多64字节。

有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
#1、admin: 从身份认证的角度讲,这是“root”数据库,如果将一个用户添加到admin数据库,这个用户将自动获得所有数据库的权限。再者,一些特定的服务器端命令也只能从admin数据库运行,如列出所有数据库或关闭服务器
#2、local: 这个数据库永远都不可以复制,且一台服务器上的所有本地集合都可以存储在这个数据库中
#3、config: MongoDB用于分片设置时,分片信息会存储在config数据库

4、强调:把数据库名添加到集合名前,得到集合的完全限定名,即命名空间

例如:
如果要使用cms数据库中的blog.posts集合,这个集合的命名空间就是
cms.blog.posts。命名空间的长度不得超过121个字节,且在实际使用中应该小于100个字节

图片 10

三、安装

1、安装

#1、安装路径为D:\MongoDB,将D:\MongoDB\bin目录加入环境变量

#2、新建目录与文件
D:\MongoDB\data\db
D:\MongoDB\log\mongod.log

#3、新建配置文件mongod.cfg,参考:https://docs.mongodb.com/manual/reference/configuration-options/
systemLog:
   destination: file
   path: "D:\MongoDB\log\mongod.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "D:\MongoDB\data\db"
net:
   bindIp: 0.0.0.0
   port: 27017
setParameter:
   enableLocalhostAuthBypass: false

#4、制作系统服务
mongod --config "D:\MongoDB\mongod.cfg" --bind_ip 0.0.0.0 --install
或者直接在命令行指定配置

  mongod –bind_ip 0.0.0.0 –port 27017 –logpath
D:\MongoDB\log\mongod.log –logappend –dbpath   
D:\MongoDB\data\db –serviceName “MongoDB” –serviceDisplayName
“MongoDB” –install

#5、启动\关闭
net start MongoDB
net stop MongoDB

#6、登录
mongo

链接:http://www.runoob.com/mongodb/mongodb-window-install.html

 
当没有账号密码登录的时候,默认就是管理员登录。,因为刚刚做系统服务install的时候没有指定
  –auth(没有指定则没有权限认证这一说),(相当于mysql跳过授权表启动一样)

 

2、账号管理

#账号管理:https://docs.mongodb.com/master/tutorial/enable-authentication/
#1、创建有权限的用户

  use admin
  db.createUser(
    {
      user: “root”, #这个root可以随便写
      pwd: “123”,
      roles: [ { role: “root”, db: “admin” } ]
#权限,role是root说明是管理员,
    }
  )

  use test
  db.createUser(
    {
      user: “egon”,
      pwd: “123”,
      roles: [ { role: “readWrite”, db: “test” },
#针对test库有读写权限,操作自己的库有读写权限
      { role: “read”, db: “db1” } ]
#针对db1库读权限,操作其他库有读权限
    }
  )

#2、重启数据库
mongod --remove
mongod --config "C:\mongodb\mongod.cfg" --bind_ip 0.0.0.0 --install --auth
或者
mongod --bind_ip 0.0.0.0 --port 27017 --logpath D:\MongoDB\log\mongod.log --logappend --dbpath
D:\MongoDB\data\db --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install --auth


#3、登录:注意使用双引号而非单引号
mongo --port 27017 -u "root" -p "123" --authenticationDatabase "admin"

也可以在登录之后用db.auth("账号","密码")登录
mongo
use admin
db.auth("root","123")

#推荐博客:https://www.cnblogs.com/zhoujinyi/p/4610050.html

创建账号密码+开启认证机制

3、命令行shell

#1、mongo 127.0.0.1:27017/config #连接到任何数据库config

#2、mongo --nodb #不连接到任何数据库

#3、启动之后,在需要时运行new Mongo(hostname)命令就可以连接到想要的mongod了:
> conn=new Mongo('127.0.0.1:27017')
connection to 127.0.0.1:27017
> db=conn.getDB('admin')
admin

#4、help查看帮助

#5、mongo时一个简化的JavaScript shell,是可以执行JavaScript脚本的

四、基本数据类型

发表评论

电子邮件地址不会被公开。 必填项已用*标注