百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

6、MongoDB基本使用

itomcoil 2025-02-24 16:48 14 浏览

Mongodb

Mongodb优势

基础命令

管理

备份

恢复

数据库命令

集合命令

存储的数据

数据查询

数据增加

数据更新

数据删除

高级查询

比较运算符

范围运算符

或者

正则表达式

常用方法

自定义查询

返回指定的字段

排序

统计

去重

索引

创建索引

单利索引

联合索引

删除索引

查看索引

Python操作Mongodb

Mongodb

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组,它是一种非关系的数据库Nosql。

那么非关系带来的一个问题就是,耗存储空间,就比如10000条数据,每条数据都有一条是一样的,那么在关系型数据库的情况下,我们就可以直接使用外键的方式来进行存储,那么对于mongodb这样的非关系型数据库就需要每一条数据都进行存储,带来一定的资源浪费;

在关系型数据库下,扩展性比较差,如果我们开始定义了一些数据,后期想要改起来非常麻烦,而且在大数据下IO比较大,因为我们要查询一条数据出来可能需要连很多表才能把这个数据给完整展现出来。那对Mongodb来说,它解决这个问题就非常简单,因为它是菲关系的,数据和数据之间没有任何关联,不涉及到连表查询,同时打来的好处就是速度快,灵活性比较好,不需要预先为表做字段,直接插即可;

Mongodb优势

易扩展性:NoSQL数据库种类繁多,但是一个共同的特点就是去掉关系型数据库的关系特性,数据之间无关系,这样就非常易于扩展;

性能高:在大数据量的情况下表现优秀,NoSQL数据库都具有非常搞的读写性能,尤其是在大数据量下,这得益于它的无关系性,数据库结构简单;

灵活性:NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式,而在关系型数据库里,增删字段是一见非常麻烦的事情;

基础命令

管理

管理包含数据备份和恢复;

备份

mongodump -h dbHost -d dbName -o backupDir

恢复

mongorestore -h dbHost -d dbName --dir backupDir

数据库命令

show dbs:查看库;

use:切换数据库;

db:查看当前数据库;

db.dropDatabase():删除当前数据库;

集合命令

show collections:查看当前数据库的所有集合;

db.集合名称.drop():删除集合;

db.createCollection("cce"):创建一个集合;

存储的数据

Object ID:文档ID;

每个文档都有一个_id,保证文档的唯一性,如果没有显示定义,那么mongodb会自动生成;

Sting:字符串,必须是有效的utf8;

Boolean:存储一个布尔类型,true或false;

Integer:整形可以是32位或者64位;

Double:存储浮点数;

Arrays:数组或者列表,多个值存储到一个文档;

Object:用于嵌入式的文档,即一个值为一个文档;

Null:存储null值;

Timestamp:时间戳;

Date:存储当前时间或者时间的unix格式;

创建日期的语句:new Date('2018-01-15') # 需要传入一个时间;

数据查询

db.集合名称.find():查找指定的数据,如果没有给定查询条件,默认查询所有, db.caichangen.find({"age":18})这是一个给定条件的示例;

数据增加

db.caichangen.insert({"name":"cce","age":18}) # 增加一条数据{"name":"cce","age":18}) # 如果数据已存在那么会抛出错误;

db.caichangen.save({"name":"cce","age":18}) # 增加一条数据{"name":"cce","age":18}) # 如果已存在就更新,如果不存在那么就插入;

数据更新

语法:db.集合名称.update(,,{multi:})

更新一条数据:db.caichangen.update({},{age:30}) | db.caichangen.update({},{$set:{age:30}})

条件更新:db.caichangen.update({age:20},{age:30})

批量更新:db.caichangen.update({age:20},{$set:{age:30}},{multi:true})

数据删除

语法:db.集合名称.remove(,{justOne:})

query:查询条件;

justOne:布尔值,为true删除一条,默认false删除所有数据;

删除匹配条件的所有:db.caichangen.remove({age:30},{justOne:false})

高级查询

find:查询,可以在后面加上pretty()将结果格式化;

findOne:查询,返回第一个集合,可以在后面加上pretty()将结果格式化;

比较运算符

等于:默认是等于判断,没有运算符;

$lt:小于;

$lte:小于等于;

$gt:大于;

$gte:大于等于;

$ne:不等于;

语法:db.caichangen.find({age:{$lt:18}})

范围运算符

$in:是否在某个范围内;

$nin:是否在某个范围内;

语法:db.caichangen.find({age:{$in:[18,19]}})

或者

and:并且;

$or:值为数组,数组中每个元素为json;

语法:db.caichangen.find({$or:[{age:18},{name:"cce"}]})

查询姓名为cce或者cfj并且年龄是18的:db.caichangen.find({$or:[{name:"cfj"},{name:"cce"}],age:18})

正则表达式

使用//或者$regex编写正则表达式;

语法:

db.caichangen.find({name:/^c/})

db.caichangen.find({name:{$regex:'e$'}})

常用方法

limit:限制返回指定数量的文档;

db.caichangen.find().limit(Number)

skip:用于跳过指定数量的文档;

db.caichangen.find().skip(Number)

同时使用:

db.caichangen.find().limit(Number).skip(Number)

自定义查询

使用$where后面写一个函数,返回满足条件的数据;

示例:

db.caichangen.find({$where:function(){return this.age>30;}})

返回指定的字段

语法:db.集合名称.find({},{字段:0/1}) # 0不显示,1显示;

示例:

db.caichangen.find({name:{$regex:'e$'}},{age:1,_id:0})

排序

sort:sort可以在返回结果集后进行排除处理,传入一个1或者-1,1升序,-1降序;

示例:

db.caichangen.find().sort({age:1})

统计

count:可以对结果集进行统计,也可以直接统计集合;

示例:

db.caichangen.find().count()

db.caichangen.count({age:{$gt:20}})

去重

distinct:可以对结果集进行去重;

语法:

db.集合名称.distinct('去重字段':{条件})

示例:

db.stu.distinct('age':{age:{$gt:18}})

索引

建立索引提升查询速度,默认情况下mongodb会自动将_id字段设置为索引;

创建索引

单利索引

测试:插入10万条数据到数据库中

for(var i=0;i<100000;i++){db.caichangen.insert({name:"cce"+i,age:i})}

测试:

db.caichangen.find({'name':'cce10000'}) # 测试查询

db.caichangen.find({'name':'cce10000'}).explain('executionStats') # 查看上面查询语句的执行状态信息,executionTimeMillis是查询时间;

创建索引:

语法:db.集合名称.ensureIndex({属性:1/-1}) # 1表示升序,-1表示降序,-1的使用场景是经常使用sort来操作数据;

示例:db.caichangen.ensureIndex({name:1})

联合索引

语法:db.集合名称.ensureIndex({属性:1/-1,属性:1/-1})

删除索引

语法:db.集合名称.dropIndex('索引名称')

查看索引

语法:db.集合名称.getIndexs()

Python操作Mongodb

安装:pip install pymongo

from pymongo import MongoClient

client = MongoClient(host='192.168.1.254', port=27017) # 初始化一个client对象,拿到一个连接初始化信息

collection = client['cce']['caichangen'] # 指定要连接的库和集合

# 清空数据库

collection.drop()

# 插入单条数据

date = {"_id": 1, "name": "cce0", "age": 100}

collection.insert(date)

# 插入多条数据

data_many=[{"name": "name" + str(1000+i), 'age': i} for i in range(10)] # 创建数据

collection.insert_many(data_many) # 多条插入

# 查询所有数据

result=collection.find({'name':'cce0'}) # 返回一个游标对象,它是一个可迭代对象,当游标走到最后的时候那么就获取不到数据了,和我们的生成器一样;

for i in result:

print(i)

# 查询一条数据

result=collection.find_one({'name':'cce0'})

print(i)

# 更新一条数据

collection.update_one({'name':'cce0'},{"$set":{'name':'caichangen'}})

# 更新所有数据

collection.update_many({'name':'cce0'},{"$set":{'name':'caichangen'}})

相关推荐

selenium(WEB自动化工具)

定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...

开发利器丨如何使用ELK设计微服务中的日志收集方案?

【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...

高并发系统设计:应对每秒数万QPS的架构策略

当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...

2025 年每个 JavaScript 开发者都应该了解的功能

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...

JavaScript Array 对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战

刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...

动力节点最新JavaScript教程(高级篇),深入学习JavaScript

JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...

一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code

当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...

「晚安·好梦」努力只能及格,拼命才能优秀

欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...

JavaScript 中 some 与 every 方法的区别是什么?

大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...

10个高效的Python爬虫框架,你用过几个?

小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...

12个高效的Python爬虫框架,你用过几个?

实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...

pip3 install pyspider报错问题解决

运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...

PySpider框架的使用

PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...

「机器学习」神经网络的激活函数、并通过python实现激活函数

神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...