MongoDB数据库操作以及python连接MongoDB_模块中定义了连接和操作mongodb数据库的功能_小泽十一章的博客-程序员资料

技术标签: python  MongoDB  

MongoDB作为最像关系型数据的非关系型数据库,有许多类似SQL的功能,他是一个基于分布式文件储存的数据库,由C++编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
MongoDB的主要特点:

  • MongoDB 的提供了一个面向文档存储,操作起来比较简单和容易。
  • 你可以在 MongoDB记录中设置任何属性的索引( 如 : FirstName=“Sameer”, Address=“8 Gandhi Road”)来实现更快的排序。
  • 你可以通过本地或者网络创建数据镜像,这使得 MongoDB 有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo 支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻 易查询文档中内嵌的对象及数组。
  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些 指定的数据字段 。
  • Mongodb 中的 Map/reduce 主要是用来对数据进行批量处理和聚合操作。
  • Map 和 Reduce。Map 函数调用 emit(key,value)遍历集合中所有的记录, 将 key与value 传给 Reduce 函数进行处理。
  • Map函数和 Reduce函数是使用Javascript 编写的 , 并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  • MongoDB 支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP, C#等多种语言。
  • MongoDB 安装简单。

MongoDB术语/概念与SQL区别:

SQL 术语/概念 MongoDB 术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接, MongoDB 不支持
primary key primary key 主键, MongoDB 自动将_id 字 段设置为主键

MongoDB中数据库基本操作

展示所有数据库列表:
show dbs
在这里插入图片描述
创建数据库:
use database_name,会创建数据库并切换至该数据库
在这里插入图片描述
显示所在数据库:
db
在这里插入图片描述
删除数据库:
先进入想要删除的数据库,然后输入db.dropDatabase()
在这里插入图片描述

MongoDB集合(数据库表)

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关 联性。
创建集合:
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文档(数据记录行)

MongoDB文档时一组键值(key-value)对(BSON),例如{“name”:“xiaowang”,“age”:18}
文档不需要设置相同的字段,相同的字段不需要相同的数据类型,这是其区别于关系型数据库很重要的一点,也是MongoDB的特点。
MongoDB需要注意的点:

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

和其他数据库一样,我们大部分时间都是在操作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:可选参数,抛出异常的级别
更新操作符:

  • $currentDate 将字段的值设置为当前日期,可以是Date或Timestamp。
  • $inc 按指定的数量增加字段的值。
  • $min 仅当指定的值小于现有字段值时才更新字段。
  • $max 仅当指定的值大于现有字段值时才更新字段。
  • $mul 将字段的值乘以指定的量。
  • $rename 重命名字段。
  • $set 设置文档中字段的值。
  • $setOnInsert 如果更新导致文档插入,则设置字段的值。对修改现有文档的更新操作没有影响。
  • $unset 从文档中删除指定的字段。


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

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})
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44951273/article/details/100553732

智能推荐

Compose搭档 — Flow、Room_room flow_乐翁龙的博客-程序员资料

文章目录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系列文章,请点原文阅读

[Python嗯~机器学习]---简述支持向量机(SVM)和核函数_鹏鹏哥哥的小红帽的博客-程序员资料

简述支持向量机这一个博客我们还是讨论监督学习和分类问题-----支持向量机 / SVM还是用问题引出我们的内容。我们在逻辑回归中通过对概率值的惩罚来判断决策边界,那么我我们在SVM中怎么分类?在线性不可分的高维度情况下,我们对样本进行分类?这样就引出了我们支持向量机中的最重要的两个内容1、顾名思义的支持向量(离决策边界最近的点)~~~2、引入核函数,使线性不可分的内容线性可分...

非同步DCDC的工作模式(CCM、DCM和BCM)_bcm模式_努力不期待的博客-程序员资料

目录1. 非同步DCDC的三种工作模式2. 如何从CCM切换到DCM?3. 电感电流交流纹波与电感值的关系?4. 电感饱和意味着什么?1. 非同步DCDC的三种工作模式非同步DCDC工作在哪种模式,取决于拓扑和输出功率,输入电压和输出电压的大小。CCM,连续导通模式,一个开关周期内电感电流>0。DCM,断续导通模式,一个开关周期内电感电流 ≥ 0。BCM,临界导...

Python基础----Socket编程规范及底层原理(一)_Lzs1998的博客-程序员资料

 今天先给大家讲讲什么是Socket,明白其底层实现原理是非常重要的,不明白底层的话写出来的代码会非常low,能否明白底层实现是正规军和杂牌军的重要区别之一,好了,不废话了,开始干!一.Socket1.为什么要socket?可能很多人都听说过C/S架构,即client/server架构(客户端/服务端架构),而C/S架构有硬件C/S架构(打印机),软件C/S架构(如百度网站就是服务...

vue-cli安装scss,element-ui,md5,vuex_Nancy617的博客-程序员资料

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 命令_伊织code的博客-程序员资料

tr 命令关于 tr语法参数说明字符集合的范围使用示例大小写转换删除反选删除替换组替换非 替换压缩manual

随便推点

python import其他包_程序员的拿来主义,Python模块管理的入门详解,初学者福利_weixin_39830917的博客-程序员资料

我在写第一行Python之前,以为自己是一个C/C++、JAVA程序员,每天写着大段大段 “高端” 代码乐在其中。这会顺便去以前的博客掐了一段10年前写过的一段C++的代码,如果没有备注的话今天我都不这么看得懂当初在写什么了。// 文件下载int fwrite(void *buffer, size_t size, size_t nmemb, void *stream){ struc...

26设计模式之观察者模式_欢乐斗佛的博客-程序员资料

观察者模式是一种使用非常多,也非常有用的一种设计模式。该模式有2种对象,一种是被观察者,一种是观察者。被观察者是唯一的,观察者可以有多个,是一种一对多的关系。举个例子,好比我们去追一部正在更新的电视剧,这部电视剧就是我们被观察者而追电视剧的人就是观察者,如何在电视剧更新的时候追电视剧的人第一时间知道就是观察者模式需要解决的这类问题。在安卓中使用观察中是非常简单的,因为这两种对象Google已经帮我

【转】如何评价 Apple 新推出的编程语言 Swift?_weixin_30505751的博客-程序员资料

如何评价 Apple 新推出的编程语言 Swift?原文地址:http://www.zhihu.com/question/24002984评价:如果你会Objective-C,你不需要去看它。 如果问我这语言对普通开发者重要不重要,我说重要,可以明确告诉你这一点--它是Apple 在WWDC 向全世界推出的重磅语言我怎么能说它不重要?它降低了入门的门槛。使得大量的JS, Pyth...

JAVA设计模式介绍(23种)_y_keven的博客-程序员资料

设计模式主要分三个类型:创建型、结构型和行为型。 其中创建型有: 一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。 三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory

CentOS7 修改默认时区为 北京时间_山清水秀iOS的博客-程序员资料

首先同步时间yum install -y ntpdatentpdate -u cn.pool.ntp.org然后设置中国时区(北京时间)timedatectl set-timezone Asia/Shanghai重启OSreboot转载于:https://www.cnblogs.com/comexchan/p/10781522.htm...

推荐文章

热门文章

相关标签