MongoDB作为最像关系型数据的非关系型数据库,有许多类似SQL的功能,他是一个基于分布式文件储存的数据库,由C++编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
MongoDB的主要特点:
MongoDB术语/概念与SQL区别:
SQL 术语/概念 | MongoDB 术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接, MongoDB 不支持 | |
primary key | primary key | 主键, MongoDB 自动将_id 字 段设置为主键 |
展示所有数据库列表:
show dbs
创建数据库:
use database_name
,会创建数据库并切换至该数据库
显示所在数据库:
db
删除数据库:
先进入想要删除的数据库,然后输入db.dropDatabase()
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关 联性。
创建集合:
1、创建数据库后,直接在数据中添加数据可自动创建相应集合
2、db.createCollection(name,options)
,name表示要创建的集合名,options是可选参数,指定有关内存大小及索引的选项。
options可选参数如下:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的 集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
autoIndexId | 布尔 | (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | 数值 | (可选)为固定集合指定一个最大值(以字节计)。 如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
查看已有集合:
show collections/show tables
删除集合:
db.collection.drop()
MongoDB文档时一组键值(key-value)对(BSON),例如{“name”:“xiaowang”,“age”:18}
文档不需要设置相同的字段,相同的字段不需要相同的数据类型,这是其区别于关系型数据库很重要的一点,也是MongoDB的特点。
MongoDB需要注意的点:
和其他数据库一样,我们大部分时间都是在操作MongoDB文档,MongoDB的增删改查:
增
MongoDB使用insert()或save()方法向集合中插入文档,语法如下
db.collection_name.insert(document)
例:
db.classes.insert({
"class":"python","name":"小王"})
db.collection_name.save(document)
,save()方法如果不加_id字段和insert()方法一样,但是如果添加了_id字段,且没有该_id字段,会插入一条新数据,如果集合中已经存在该字段,会更新该字段的数据。
例:
db.classes.save({
"_id":100,"class":python,"name":"小黄"})
删
db.collection_name.remove(query,justOne,writeConcern)
,其中query为删除条件。
justOne可选,如果设置为ture或者1,会删除第一条符合条件的文档,默认为false,全部删除。
writeConcern可选,代表抛出异常的级别。
例:
db.test.remove({age:19},true)
改
我们已经知道当save()方法中有已存在的_id,会修改该文档数据,MongoDB中还有一个修改的方法update()
db.collection_name.update(query,update,upsert,multi,writeConcern)
参数说明:
query:修改条件
update:需要进行更新的操作
upsert:可选参数,设置成true,如果修改条件不存在会添加,默认为false,不添加
multi:可选参数,默认为false,只更新找到的第一条数据,设置成true会修改所有符合条件的数据
writeConcern:可选参数,抛出异常的级别
更新操作符:
查
db.collection_name.find(query,projection)
,query为可选操作,代表查询条件,不写代表查询所有。projection可选参数,使用投影操作符指定返回的键。查询时返回文档中 所有键值, 只需省略该参数即可(默认省略)。
如果想要显示易读模式,可使用db.collection_name.find(query,projection).pretty()
除了find()以外,还有findOne()方法,只返回一个文档。
MongoDB的查询和sql语句类似,只不它的查询语句以键值对的形式存在,MongoDB与sql中where语句的对比
操作 | 格式 | 范例 | SQL语句 |
---|---|---|---|
等于 | {<key>:<value> } | db.col.find({“name”:“小王”}).pretty() | where name = ‘小王’ |
小于 | {<key>:{$lt:<value>}} | db.col.find({“age”:{$lt:18}}). pretty() | where age < 18 |
小于或 等于 | {<key>:{$lte:<value>}} | db.col.find({“age”:{$lte:18}} ).pretty() | where age <= 18 |
大于 | {<key>:{$gt:}} | db.col.find({“age”:{$gt:18}}) .pretty() | where age > 18 |
大于或 等于 | {<key>:{$gte:<value>}} | db.col.find({“age”:{$gte:18} }).pretty() | where age >= 18 |
不等于 | {<key>:{$ne:<value>}} | db.col.find({“age”:{$ne:18}} ).pretty() | where age != 18 |
MongoDB中OR和AND的用法
AND:find()可传入多个键,每个键以逗号隔开,表示and,db.col.find({key1:value1,key2:value2}).pretty()
,类似sql中的WHERE age = 18 AND name = “小王”。
OR:MongoDB中的or条件语句使用了关键字$or,语法格式如下:
db.col.find({$or:[{key1:value1},{key2:value2}]}).pretty()
,类似sql中的WHERE age = 18 OR name = “小王”。
AND 和 OR联合使用:例如我们要查询所有班级中属于python班的和年龄为18岁的或者属于python班的和年龄为19岁的,mysql中可以这样写:SELECT * FROM classes WHERE class = "python" AND (age = 18 OR age = 19)
,在MongoDB中可以这样写:
db.classes.find({class:"python"},$or:[{age:18},{age:19}]).pretty()
$type操作符:
类型 | 数字 | 备注 |
---|---|---|
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | 已废弃。 |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JavaScript | 13 | |
Symbol | 14 | |
JavaScript (with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | Query with -1. |
Max key | 127 |
来源:https://www.runoob.com/mongodb/mongodb-operators-type.html
例如,我们要查询classes中所有name为String类型的数据:db.classes.find({name:{$type:2}})
MongoDB limit()
limit()方法可用于获取指定数量的数据记录,接受一个数字参数,表示查看的数据条数,语法如下:
db.COLLECTION_NAME.find().limit(NUMBER)
MongoDB skip()
limit()可以指定查看数据的数量,skip则是跳过指定数量的数据,同样接收一个数字,语法如下:
db.COLLECTION_NAME.find().skip(NUMBER)
例如db.col.find().skip(2)
表示col中所有数据中搁2个取一个。
MongoDB sort()
sort() 方法用于对数据进行排序,可通过参数进行指定排序的字段,使用-1或1指定排序的方式,1为升序,-1为降序,语法如下:
db.COLLECTION_NAME.find().sort({
key:1})
例如db.col.find().sort({"age":-1})
表示取出col的所有数据并以age字段进行逆序排序
MongoDB count()
count()方法用于数据的统计,语法如下:
db.col.count() 或 db.col.find().count()
MongoDB aggregate()
MongoDB中聚合(aggregate)主要用于处理数据,例如统计平均值,求和等,并返回计算后的数据结果,语法如下:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
一些常用聚合表达式
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和。 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$sum : “$likes”}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$avg : “$likes”}}}]) |
$min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$min : “$likes”}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$max : “$likes”}}}]) |
python中操作MongoDB需要安装第三方模块pymongo:pip install pymongo
# 连接本机mongo
client = pymongo.MongoClient("127.0.0.1",27017)
# 选择test库
db = client.test
# 查询所有数据
db.test.find().pretty()
# 插入数据
db.test.insert({
"name":"小王","age":18})
文章目录Compose如虎添翼 -- 搭配Flow、Room!!!一、需求一览二、Compose UI开发三、Room集成及使用3.1、在使用kotlin编写的gradle脚本中集成3.2、使用方式3.2.1、数据库表(Table)3.2.2、数据访问对象(DAO-DataAccessObjects )3.2.3、数据库(Database)3.2.4、添加节气数据到数据库四、Compose + Flow五、小结Compose如虎添翼 – 搭配Flow、Room!!!Compose系列文章,请点原文阅读
简述支持向量机这一个博客我们还是讨论监督学习和分类问题-----支持向量机 / SVM还是用问题引出我们的内容。我们在逻辑回归中通过对概率值的惩罚来判断决策边界,那么我我们在SVM中怎么分类?在线性不可分的高维度情况下,我们对样本进行分类?这样就引出了我们支持向量机中的最重要的两个内容1、顾名思义的支持向量(离决策边界最近的点)~~~2、引入核函数,使线性不可分的内容线性可分...
目录1. 非同步DCDC的三种工作模式2. 如何从CCM切换到DCM?3. 电感电流交流纹波与电感值的关系?4. 电感饱和意味着什么?1. 非同步DCDC的三种工作模式非同步DCDC工作在哪种模式,取决于拓扑和输出功率,输入电压和输出电压的大小。CCM,连续导通模式,一个开关周期内电感电流>0。DCM,断续导通模式,一个开关周期内电感电流 ≥ 0。BCM,临界导...
今天先给大家讲讲什么是Socket,明白其底层实现原理是非常重要的,不明白底层的话写出来的代码会非常low,能否明白底层实现是正规军和杂牌军的重要区别之一,好了,不废话了,开始干!一.Socket1.为什么要socket?可能很多人都听说过C/S架构,即client/server架构(客户端/服务端架构),而C/S架构有硬件C/S架构(打印机),软件C/S架构(如百度网站就是服务...
vue-cli安装scss,element-ui,md5,vuexscss:cnpm install node-sass -Dnpm install sass-loader -Dvue.config.js加上:pluginOptions: { 'style-resources-loader': { preProcessor: 'sass', patterns: [ path.resolve(__dirname, './src/styles/common.scss') //
tr 命令关于 tr语法参数说明字符集合的范围使用示例大小写转换删除反选删除替换组替换非 替换压缩manual
我在写第一行Python之前,以为自己是一个C/C++、JAVA程序员,每天写着大段大段 “高端” 代码乐在其中。这会顺便去以前的博客掐了一段10年前写过的一段C++的代码,如果没有备注的话今天我都不这么看得懂当初在写什么了。// 文件下载int fwrite(void *buffer, size_t size, size_t nmemb, void *stream){ struc...
观察者模式是一种使用非常多,也非常有用的一种设计模式。该模式有2种对象,一种是被观察者,一种是观察者。被观察者是唯一的,观察者可以有多个,是一种一对多的关系。举个例子,好比我们去追一部正在更新的电视剧,这部电视剧就是我们被观察者而追电视剧的人就是观察者,如何在电视剧更新的时候追电视剧的人第一时间知道就是观察者模式需要解决的这类问题。在安卓中使用观察中是非常简单的,因为这两种对象Google已经帮我
Springboot 使用管道设计模式 , 实践案例玩一玩
如何评价 Apple 新推出的编程语言 Swift?原文地址:http://www.zhihu.com/question/24002984评价:如果你会Objective-C,你不需要去看它。 如果问我这语言对普通开发者重要不重要,我说重要,可以明确告诉你这一点--它是Apple 在WWDC 向全世界推出的重磅语言我怎么能说它不重要?它降低了入门的门槛。使得大量的JS, Pyth...
设计模式主要分三个类型:创建型、结构型和行为型。 其中创建型有: 一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。 三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory
首先同步时间yum install -y ntpdatentpdate -u cn.pool.ntp.org然后设置中国时区(北京时间)timedatectl set-timezone Asia/Shanghai重启OSreboot转载于:https://www.cnblogs.com/comexchan/p/10781522.htm...