MongoDB基本操作

为什么需要MongoDB

设置数据存储时,您的首要任务是回答以下问题:“我想存储哪些数据以及这些字段之间如何关联?”。

本指南使用一个假设的库存数据库来跟踪项目及其数量、大小、标签和评级。

以下是您可能希望捕获的字段类型的示例:

名称数量尺寸地位标签评分
杂志2514x21,cm一种棕色,有衬里9
笔记本508.5x11,英寸一种大学统治,穿孔8
1008.5x11,英寸D水彩10
规划师7522.85x30,cmD2019年10
明信片4510x,cmD双面,白色2

数据存储格式 JSON

虽然表可能看起来是存储数据的好地方,但正如您从上面的示例中看到的,此数据集中的某些字段需要多个值,并且如果在单个列中建模(例如例如 尺寸和标签)。

在 SQL 数据库中,可以通过创建关系表来解决这个问题。

在 MongoDB 中,数据存储为文档。这些文档以JSON(JavaScript Object Notation)格式存储在 MongoDB 中。JSON 文档支持嵌入字段,因此相关数据和数据列表可以与文档一起存储,而不是与外部表一起存储。

JSON 格式为名称/值对。在 JSON 文档中,字段名和值用冒号分隔,字段名和值对用逗号分隔,字段集封装在“花括号”({})中。

如果您想开始对上述行之一进行建模,例如这一行:

名称数量尺寸地位标签评分
笔记本508.5x11,英寸一种大学统治,穿孔

8

可以从namequantity字段开始。在 JSON 中,这些字段如下所示:

{"名称": "笔记本", "数量": 50}


确定嵌入数据的候选对象并为数据建模

接下来,我们将决定哪些字段需要多个值。这些字段将是嵌入文档或文档中嵌入文档的列表/数组的候选者。

例如,在上面的数据中,尺寸`可能包含三个字段:

{ "h": 11, "w": 8.5, "uom": "in" }


 

并且某些项目有多个评级,因此ratings可能表示为包含字段的文档列表scores

[ { "score": 8 }, { "score": 9 } ]

而且您可能需要为每个项目处理多个标签。因此,您也可以将它们存储在列表中。

[ "college-ruled", "perforated" ]


 

最后,存储库存项目的 JSON 文档可能如下所示:

{
 "name": "notebook",
 "qty": 50,
 "rating": [ { "score": 8 }, { "score": 9 } ],
 "size": { "height": 11, "width": 8.5, "unit": "in" },
 "status": "A",
 "tags": [ "college-ruled", "perforated"]
}


 

这看起来与您在步骤 1 中开始使用的表格数据结构非常不同。

总结

恭喜。您现在已经了解如何使用 JSON 文档构建数据。

MongoDB介绍

MongoDB是一个开源文档数据库,提供高性能,高可用性和自动扩展,旨在为WEB应用提供可扩展的高性能数据存储解决方案。

1 基于分布式文件存储数据库(就是一个数据库
2 C++语言编写
3 支持的数据结构非常松散,是类似json的bson格式(后期插入修改数据写JSON


 

MongoDB中的记录是一个文档,它是由字段和值(key=>value)对组成的数据结构。 MongoDB文档与JSON对象相似。 字段的值可能包括其他文档,数组和文档数组。

1 JSON(JavaScript Object Notation, JS 对象简谱)是一种轻量级的数据交换格式
2 bson(二进制JSON)

在mongodb中基本的概念是文档(document)、集合(collection)、数据库(database)。

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

MongoDB安装

安装

安装教程:https://blog.csdn.net/qq_34731574/article/details/57416920

命令执行完毕后,在浏览器输入:http://localhost:27017,
检查是否安装成功

创建服务

安装成功后,将MongoDB服务器作为Windows服务运行。

1自行创建data文件夹和日志log文件夹,在data文件夹中创建db子文件夹,用来存放数据库,然后在mongo.cfg中添加配置信息:

1 dbpath=D:\MongoDB\data\db
2 logpath=D:\MongoDB\log\mongo.log


2接着在 bin 目录下,输入:

 例如: mongod –config D:\MongoDB\mongo.cfg –install –serviceName “MongoDB” ;
 注意1:比如通过管理员身份运行DOS窗口 否则没有权限创建失败
 注意2:得提前创建数据和日志存放目录


 

3配置环境变量:在系统的环境变量 path的值 后面加上mongodb的安装路径

在path值的最后加 ;D:\MongoDB\mongodb\bin(分号不要忘)

4打开mongo的服务: net start MongoDB

5关闭服务:net stop MongoDB

MongoDB基本操作

查看数据库

show databases
或者
show dbs

在这里插入图片描述

admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。

local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合

config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

选择数据库

use 数据库名

在这里插入图片描述

以上示例命令中,“local” 是要链接的数据库。

数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。

不能是空字符串("")。

不得含有’ '(空格)、.、$、/、\和\0 (空字符)。

应全部小写。

最多64字节。

有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。

但是,当我们指定连接不存在的数据库时:并不会报错

在这里插入图片描述

这是MongoDB的隐式创建的方法,后面当对其插入集合文档时候自然创建。

查看集合


show collections

在这里插入图片描述

选择数据库—》再查看

创建集合

db.createCollection('集合名')


在这里插入图片描述

隐式创建数据库test1,查看是没有集合的,通过语句创建集合’c1’ ,‘c2’。

删除集合

语法:db.集合名.drop()
在这里插入图片描述

思考:如何删除数据库?

回答:1通过use语法选中数据库,2通过db.dropDatabase()删除数据库

MongoDB文档增删修查(CURD)

创建文档

文档是一组键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
{"name":"mantianxing","others":"xiaoxiannv"}

下表列出了 RDBMS 与 MongoDB 对应的术语:

RDBMSMongoDB
数据库数据库
表格集合
文档
字段
表联合嵌入文档
主键主键 (MongoDB 提供了 key 为 _id )
数据库服务和客户端
Mysqld/Oraclemongod
mysql/sqlplusmongo

需要注意的是:
①. 文档中的键/值对是有序的。

②. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。

③. MongoDB区分类型和大小写。

④. MongoDB的文档不能有重复的键。

⑤. 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
键不能含有\0 (空字符)。这个字符用来表示键的结尾。

和$有特别的意义,只有在特定环境下才能使用。

以下划线"_"开头的键是保留的(不是严格要求的)。

C增

语法:db.集合名.insert(JSON数据)


 

说明:集合存在-则直接插入数据,集合不存在-隐式创建

练习:在test2数据库的c1集合中插入数据(姓名叫mantianxing年龄33岁)

use test2//隐式创建
db.c1.insert({uname:"mantianxing", age:33})
留心1:数据库和集合不存在,都可以隐式创建
留心2:对象的键统一不加引号方便看,但是查看集合数据时系统会自动加
留心3:mongodb会给每条数据增加一个全球唯一的_id键

在这里插入图片描述

_id的组成

在这里插入图片描述

思考1:是否可以自定义_id值?

回答:可以,只需要给插入的JSON数据增加_id键即可覆盖(但实战强烈不推荐
db.c1.insert({_id:1, uname:"mantianixng", age:18})

思考2:如何一次性插入多条记录?

回答:传递数据,数组中写一个个JSON数据即可

db.c1.insert([
{uname:"z3", age:3},
{uname:"z4", age:4},
{uname:"w5", age:5}
])

在这里插入图片描述

思考3:如何快速插入10条数据?

回答:mongodb底层使用JS引擎实现的,所以支持部分js语法

因此:可以写for循环

for (var i=1; i<=10; i++) {
print(i)
}
需求:在test2数据库c2集合中插入10条数据,分别为 a1 a2 ... a10
use test2
for (var i=1; i<=10; i++) {
db.c2.insert({uanme: "a"+i, age: i})
}


 

在这里插入图片描述

R查

基础语法:db.集合名.find(条件 [,查询的列])

条件
查询所有数据                 {}或者不写
查询age=6的数据               {age:6}
既要age=6又要性别=男          {age:6,sex:'男'}
查询的列(可选参数
不写 - 这查询全部列(字段
{age:1} 只显示age列(字段
{age:0} 除了age列(字段都显示
留心:不管你怎么写系统自定义的_id都会在


升级语法

db.集合名.find({键:值}) 注:值不直接写
{运算符:值}
db.集合名.find({
键:{运算符:值}
})
运算符作用
$gt大于
$gte大于等于
$lt小于
$lte小于等于
$ne不等于
$inin
$ninnot in

练习1:查询所有数据
db.c1.find()
//不加条件查询所有数据
db.c1.find({},{name:1}) 
//只查name列
db.c1.find({},{name:0}) 
//只查除去name列以外的列

练习2:查询年龄大于5岁的数据

db.c1.find({name:{%gt:5}})

练习2:查询年龄大于5岁的数据
 

db.c1.find({name:{%gt:5}})
练习3:查询年龄是5岁、8岁、10岁的数据
db.c1.find({age:{%in:[5,8,10]}})

U改

基础语法: db.集合名.update(条件, 新数据 [,是否新增,是否修改多条])

是否新增:指条件匹配不到数据则插入(true是插入,false否不插入默认)
是否修改多条:指将匹配成功的数据都修改(true是,false否默认)

升级语法

说明:
是否新增:指匹配不到数据则插入(true-是插入,false-否不插入默认)
是否修改多条:将匹配成功的数据都修改(true-是,false-否默认)
db.集合名.update(条件, 新数据)
                    {修改器: {键:值}}


 

修改器作用
$inc递增
$rename重命名列
$set修改列值
$unset删除列

准备工作

创建c3集合,循环插入文档数据

use test2;
for(var i = 1; i<= 10; i++){
db.c3.insert( {"uname":"zs"+i,"age":i} );
}

练习1:将{uname:“zs1”}改为{uname:“zs2”}

db.c3.update({uname:"zs1"},{uname:"zs2"})

在这里插入图片描述

发现:默认不是修改,而是替换
解决:使用升级语法 修改器

需求:使用修改器将zs4的姓名改为zs44

语法:db.c3.update({uname:"zs4"}, {$set: {uname: "zs44"}})

在这里插入图片描述
 

练习2:给{uname:“zs10”}的年龄加2岁或者减2岁

db.c3.update({uname:"zs10"}, {$inc: {age: 2}})
db.c3.update({uname:"zs10"}, {$inc: {age: -2}})

在这里插入图片描述

练习3:修改器综合练习

插入数据:db.c4.insert( {uname:“mantianxing”,age:33,who:“女”,other:“小仙女”});

完成需求:
uname 改成 zoupeiqing (修改器:$set)
age 增加 99 (修改器:$inc)
who 改字段 sex (修改器:$rename)
other 删除 (修改器:$unset)
语法分析:
db.c4.update({uname:"mantianxing"}, {uname:
"zoupeiqing"}) #错误,替换

{$set: {uname:
"zoupeiqing"}}
{$inc: {age: 99}}
{$rename: {who:
"sex"}}
{$unset: {other:
true}}

留心如何一次性写多个修改器
db.c4.update({uname:"mantianxing"}, {
$set: {uname: "zoupeiqing"},
$inc: {age: 99},
$rename: {who: "sex"},
$unset: {other: true}
})

在这里插入图片描述

练习4:验证语法最后两个参数(了解)

【验证】是否新增 true是 false否:修改uname 等于 zs30的年龄 30岁

在这里插入图片描述

默认是false ,找不到就不管

若是true,则找不到就插入

【验证】是否修改多条 true是,false否 默认false

在这里插入图片描述

默认只修改一条数据

D删

语法:db.集合名.remove(条件 [, 是否删除一条] )

注意:是否删除一条 true是,false否 默认false

在这里插入图片描述

小总结

所有数据库都需要增删改查CURD标识
MongoDB删除语法:remove
增Create
删Delete
改Update
查Read
db.集合名.insert(JSON数据)

db.集合名.remove(条件 [,是否删除一条true是false否默认])
也就是默认删除多条

db.集合名.update(条件, 新数据 [,是否新增,是否修改多条])
升级语法

db.集合名.update(条件,{修改器:{键:值}})
db.集合名.find(条件 [,查询的列])
else ,找不到就不管
若是true,则找不到就插入
  • 19
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值