Mongodb数据增删改查
RDB:数据库 → 表(列) → 行
Mongo:数据库 → 集合 → 文档
SQL和Mongodb的关系映射表(里面还有一些增删改查等等操作与SQL的对应的语句):
https://www.mongodb.com/docs/manual/reference/sql-comparison/
mongodb数据格式是以BSON(二进制 json)存储的。https://www.mongodb.com/docs/v5.0/core/document/#documents
因此它本身就是用json格式来操作数据,底层在存储的时候改为BSON,它的文件数据格式如下:

mongodb最大的特点就是,数据库和集合不用创建就能插入数据,而且集合中数据也不管你有那些字段,随便插入。这点非常适合爬虫,因为你爬取的数据有些字段它不一定有。
mongodb他没有redis快,但是比RDB快,因为他读写都是先经过内存,然后内存数据再单独存储在磁盘。
注意:上面说的情况在默认存储引擎,因为Mongodb可以更改存储引擎,具体看https://www.mongodb.com/docs/manual/core/storage-engines/
数据库的操作
数据库的创建
mongodb使用use <数据库名>进行创建和选择数据库,如果选择的数据库不存在,则自动帮你创建数据库
use <数据库名>
查看所有数据库
show dbs
删除数据库
// 先选择数据库
use test001
// 再执行删除操作
db.dropDatabase()
集合的操作
创建集合
正常情况下集合都不用手动创建,因为mongodb不需要集合存在就可以使用,你插入数据时它就会帮你自动创建。
一般只有在需要创建固定类型的集合的时候才需要手动创建。
什么是固定集合呢?
固定集合就是固定集合的大小体积或者固定集合中文档数量的一个集合,比较像时序数据库,一旦数据达到集合的限制,那么新数据就会覆盖最旧的数据,就像一个时钟一样循环。
集合创建语法:
db.createCollection(<集合名>, {capped: true, size: <集合的大小(字节)>, max: <集合中文档的最大数量>})
| 参数 | 类型 | 说明 |
| capped | bool | 是否为固定集合,capped为true时,必须指定size的值。 |
| size | int | 集合的固定大小(单位:字节) |
| max | int | 可选。集合中文档的最大数量。 |
查看所有集合
show collections | show tables
删除集合
db.<集合名>.drop()
实例:
// 创建test001数据库
use test001
// 查看所有的数据库
show dbs
// 创建spider_data集合
db.createCollection("spider_data")
// 查看当前数据库下的所有集合
show tables
// 删除spider_data集合
db.spider_data.drop()
文档操作-增、删、改、查
增删改查等官方文档:
https://www.mongodb.com/docs/v5.0/crud/
增删改查的操作符:
https://www.mongodb.com/docs/manual/reference/operator/update/
插入数据(增)

语法:
//3.2之前的版本用:
db.<集合名>.insert(<document>, {OPTIONS})
//3.2后可以用insertOne、insertMany。。。不过谁用3.2之前版本呀
// 插入一条数据
db.<集合名>.insertOne(
<document>,
{
writeConcern: <document>
}
)
// 插入多条数据
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
ordered:指定是否按顺序写入,默认 true,按顺序写入。
实例:
use test001
// 可以使用变量,这里的语法就是js的语法.....
let input_name = "笑答"
// 向test集合中插入一条数据
db.test.insertOne({
name: input_name, // 可以直接使用变量的值
age: 26,
hobby: "basketball"
});
// 插入多条数据
db.test.insertMany([
{name: "下排名", age: 17},
{name: "小红", age: 27},
{name: "小榄", age: 25},
])
查找数据(查)
https://www.mongodb.com/docs/v5.0/crud/#read-operations
查看过滤的条件和操作符:比如逻辑运算符and\or\not、比较运算符gt\lt\gte等等。
https://www.mongodb.com/docs/v5.0/reference/operator/query/
实例:
// 查找全部数据(你不给条件就等于全部啦)
db.test.find()
/**
* 查找, 比较运算符(相当where条件)
**/
// 查找出第一条符合条件的数据
db.test.findOne({age: {$in: [18, 17]}}) // 因为时findone,即便你有多条数据返回它页只显示一个,相当于limit 1
// 大于、 大于等于
db.test.find({age: {$gt: 18}})
db.test.find({age: {$gte: 18}})
// 小于、小于等于
// SELECT * FROM test WHERE age < 18
db.test.find({age: {$lt: 18}})
db.test.find({age: {$lte: 18}})
// 等于
db.test.find({age: 18})
db.test.find({age: {$eq: 18}})
// in 在集合内
// SELECT * FROM test WHERE age IN(18, 17, 26)
db.test.find({age: {$in: [18, 17, 26]}})
// not in 不在集合内
//SELECT * FROM test WHERE age NOT IN(18, 17, 26)
db.test.find({age: {$nin: [18, 17, 26]}})
// 逻辑运算符 and
// 相当于 SELECT * FROM test WHERE age > 18 AND hobby IS NULL
db.test.find({
age: {$gt: 18},
hobby: {$exists: false}
})
// 逻辑运算or
//SELECT * FROM test WHERE age > 22 OR hobby IS NOT NULL
db.test.find({
$or: [
{age: {$gt: 22}},
{hobby: {$exists: true}}
]
})
// 混合and 和 or 运算
//SELECT * FROM test WHERE age > 20 AND (name="小米" or hobby is not null)
db.test.find({
$and: [
{age: {$gt: 20}},
{
$or: [
{hobby: {$exists: true}},
{name: "小米"},
]
}
]
})
db.test.find({
age: {$gt: 20},
$or: [
{hobby: {$exists: true}},
{name: "小米"},
]
})
// 使用正则表达式查询
/**
* 正则表达式使用^匹配速度会快很多,否则默认是模糊类型的匹配。
* 如果你不使用$结尾,就是只要前面匹配就行,后面不管你是什么样子
**/
db.test.find({
name: /^小.$/
})
db.test.find({
name: /^小./ // 这样只要是小开头然后只要后面还有一个字符的都匹配出来,而不是说刚好匹配两个字符
})
db.test.find({
name: /^小.{2}$/ // 小字开头,然后后面跟随刚好两个任意字符结尾
})
// distinct
db.people.distinct( "status" )
修改数据(改)
https://www.mongodb.com/docs/v5.0/crud/#update-operations
修改数据的操作符(就是用来指定要怎么修改数据):
https://www.mongodb.com/docs/manual/reference/operator/update/

/**
* 修改语句
*
* db.集合(表).updateOne({查询条件},{新的数据})
* db.集合(表).updateMany({查询条件},{新的数据})
* db.collection.replaceOne() 查找并替换符合条件的第一个。
**/
// 更新指定字段(updateOne只更新第一条符合条件的记录)
db.test.updateOne(
// query
{name: "王五"},
// update
{
$set: {age: 88} // 使用$set来更新指定的字段的值
}
)
db.test.updateOne(
// query
{name: "你麻痹"},
// update
{
$set: {age: 88} // 使用$set来更新指定的字段的值
},
{
upsert: true
}
)
// updateMany更新全部符合条件的记录
db.test.updateMany(
// query
{age: 27},
// update
{
$set: {age: 88} // 使用$set来更新指定的字段的值
}
)
删除数据(删)

/**
* 删除
*
* db.test.deleteOne()
* db.test.deleteMany()
**/
db.test.deleteOne({
name: "小"
})
db.test.deleteMany({
name: "小"
})
投影(查询时只返回指定字段)
这玩意就是等同于你执行SQL语句SELECT <字段1>,<字段2> FROM <表名>
/**
* 只查询指定字段(投影)
*
* db.集合.find({查询条件}, {字段: 0|1, 字段: 0|1,...})
*
* key:字段
* val: 是否显示,用0、1控制
* 字段就是要指定的字段是否显示
* 0:不显示
* 1: 显示
**/
// _id列默认是显示的,即便你没有让他显示
db.test.find({}, {name: 1, age: 1})
// 除非你指定它不显示
db.test.find({}, {_id: 0, name: 1, age: 1})
排序sort
就是SQL中的order_by
/**
* 排序
*
* db.集合.find().sort({
* 字段: 1|-1 // -1表示倒序,1表示正序
* })
**/
// 按照age字段倒序
db.test.find().sort({age: -1})
count统计
/**
* count() 统计
**/
// 查询age大于20的数据,并统计数量
//SELECT count(*) from test where age > 20
db.test.find({age: {$gt: 20}}).count()
limit限制、skip偏移
/***
* limit 和 skip
* 也就是sql的limit和offset
*/
//SELECT * FROM test LIMIT 5 OFFSET 2
db.test.find().limit(5).skip(2)
db.test.find().skip(2).limit(5) // 顺序无关要紧...只有在聚合使用聚合管道的时候顺序才会有影响(管道后面说)
聚合操作(聚合管道、分组groupby等)
聚合操作简单点说就是根据聚合管道中的顺序,依次执行其中的聚合命令,对文档数据进行处理后输出。
示意图:

常用的聚合操作命令:
$group: 分组$match: 过滤,就是find中的过滤条件$project: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果$sort: 排序$limit: 限制聚合管道返回的⽂档数$skip: 跳过指定数量的⽂档(offset)- 其他:https://www.mongodb.com/docs/manual/reference/operator/aggregation-pipeline/
聚合管道中可以使用的各种运算符:
实例:
// 插入预先准备好的数据
db.test02.insertMany([
{
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'runoob.com',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'runoob.com',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 10
},
{
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
},
])
//select by_user, count(likes) as num_count from test02 group by by_user
db.test02.aggregate([
{
$group: {
// _id: "$by_user", // _id是用于指定按那个字段进行分组
_id: {
"by_user": "$by_user", // 也可以给分组的列指定一个名字by_user,然后下面$project可以使用by_user别名
},
num_count: {$sum: "$likes"} // num_count 是自己命名的别名,后面时对$likes字段进行$sum操作(也就是count)。
}
},
{
$project: { // project就是投影显示
"by_user": "$_id.by_user", // by_user时显示的名称,引用的值是上面管道操作后的$_id.by_user
"like_count": "$num_count",
"_id": 0 // 让”_id“列不显示
}
}
])
**// 实例2:**
db.orders.insertMany( [
{ _id: 0, name: "Pepperoni", size: "small", price: 19,
quantity: 10, date: ISODate( "2021-03-13T08:14:30Z" ) },
{ _id: 1, name: "Pepperoni", size: "medium", price: 20,
quantity: 20, date : ISODate( "2021-03-13T09:13:24Z" ) },
{ _id: 2, name: "Pepperoni", size: "large", price: 21,
quantity: 30, date : ISODate( "2021-03-17T09:22:12Z" ) },
{ _id: 3, name: "Cheese", size: "small", price: 12,
quantity: 15, date : ISODate( "2021-03-13T11:21:39.736Z" ) },
{ _id: 4, name: "Cheese", size: "medium", price: 13,
quantity:50, date : ISODate( "2022-01-12T21:23:13.331Z" ) },
{ _id: 5, name: "Cheese", size: "large", price: 14,
quantity: 10, date : ISODate( "2022-01-12T05:08:13Z" ) },
{ _id: 6, name: "Vegan", size: "small", price: 17,
quantity: 10, date : ISODate( "2021-01-13T05:08:13Z" ) },
{ _id: 7, name: "Vegan", size: "medium", price: 18,
quantity: 10, date : ISODate( "2021-01-13T05:10:13Z" ) }
] )
db.orders.aggregate( [
// Stage 1: 根据披萨的尺寸进行过滤
{
$match: { size: "medium" }
},
// Stage 2: 将符合Stage1的剩余文档按照name进行分组,然后统计分组中每个组的quantity总数
{
$group: { _id: "$name", totalQuantity: { $sum: "$quantity" } }
}
] )
Example output: 输出示例:
[
{ _id: 'Cheese', totalQuantity: 50 },
{ _id: 'Vegan', totalQuantity: 10 },
{ _id: 'Pepperoni', totalQuantity: 20 }
]
Mongodb数据增删改查的更多相关文章
- PHP实现的MongoDB数据增删改查
原文地址:https://www.mongodb.org.cn/drivers/2.html (该网站为mongoDB官方网站) php中使用mongodb你必须使用 mongodb 的 php驱 ...
- Java连接MongoDB进行增删改查
1.导入必须的包: 详情看项目:http://pan.baidu.com/s/1cvDAOY 2.通过Myeclipse创建WEB项目 3. 3.bean:创建实体类 package com.bean ...
- MongoDB的增删改查 转
MongoDB的增删改查 (黎明你好原创作品,转载请注明) MongoDB中数据的基本单元叫做文档,采用json的键-值的方式.多个键及其关联的值有序的存放在一起变是文档.类似于编程语言中的键值关系. ...
- Java实现mongodb原生增删改查语句
Java实现mongodb原生增删改查语句 2018-03-16 自动化测试时,需校验数据库数据,为了快速自动化,在代码中用原生增删改查语句操作mongodb 结构 代码 0 pom.xml < ...
- Scala对MongoDB的增删改查操作
=========================================== 原文链接: Scala对MongoDB的增删改查操作 转载请注明出处! ==================== ...
- C# 对MongoDB 进行增删改查的简单操作
C# 对MongoDB 进行增删改查的简单操作 下面演示下C#操作MongoDB驱动的简单的增删改查代码 运用到的MongoDB支持的C#驱动,当前版本为1.6.0 1,连接数据库 /// & ...
- python操作三大主流数据库(8)python操作mongodb数据库②python使用pymongo操作mongodb的增删改查
python操作mongodb数据库②python使用pymongo操作mongodb的增删改查 文档http://api.mongodb.com/python/current/api/index.h ...
- python 全栈开发,Day124(MongoDB初识,增删改查操作,数据类型,$关键字以及$修改器,"$"的奇妙用法,Array Object 的特殊操作,选取跳过排序,客户端操作)
一.MongoDB初识 什么是MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介 ...
- 2,MongoDB之增删改查及pymongo的使用
本章我们来学习一下关于 MongoDB的增删改查 一.MongoDB操作 之 原生ORM,根本不存在SQL语句 创建数据库:这里和一般的关系型数据库一样,都要先建立一个自己的数据库空间 是的,Mong ...
- SpringBoot操作MongoDB实现增删改查
本篇博客主讲如何使用SpringBoot操作MongoDB. SpringBoot操作MongoDB实现增删改查 (1)pom.xml引入依赖 <dependency> <group ...
随机推荐
- Modbus转profinet网关连接位移计在1200程序控制案例
Modbus转profinet网关连接位移计在1200程序控制案例 本案例讲述了兴达易控Modbus转profinet网关(XD-MDPN100)连接现场用台达LD-E镭射位移计检测控制在1200PL ...
- 深入理解 python 虚拟机:生成器停止背后的魔法
深入理解 python 虚拟机:生成器停止背后的魔法 在本篇文章当中主要给大家介绍 Python 当中生成器的实现原理,尤其是生成器是如何能够被停止执行,而且还能够被恢复的,这是一个非常让人疑惑的地方 ...
- 前端三件套系例之JQuery——JQuery基础、JQuery选择器、JQuery文本属性样式操作、JQuery操作DOM
文章目录 1 JQuery基础 1. 了解jQuery 1.1 什么是jQuery 1.2 什么事JS类库 1.3 常见JS类库 1.4 jQuery的优势 1.5 jQuery的版本 1.6 jQu ...
- 中国科教工作者协会与CCF PTA联合认证学习须知
中国科教工作者协会与CCF PTA联合认证学习须知 1.参与认证人员需在科技学堂(www.sciclass.cn)上进行课程学习,然后在PTA官网(pta.ccf.org.cn)报名并参加认证考试,考 ...
- np.random.uniform()
np.random.uniform(start,end,second) start:开始数 end:结束数 second:次数,也就是选择几次. 代码结果如下所示: import numpy as n ...
- PHP-FFMpeg 操作音视频
目录 安装PHP-FFMpeg 视频中提取一张图片 视频中提取多张图片 调整视频大小 视频添加水印 生成音频波形 音频转换 给音频添加元数据 拼接多个音视频 截取音视频 提取 gif 动图 裁剪视频 ...
- c# 使用打印机打印并设置打印位置及宽高
1.在界面中使用自带的控件printDocument 2.将以下函数绑定到控件的PrintPage事件 private void printDocument1_PrintPage(object sen ...
- 监控报警体系:Prometheus和Grafana
总体 prometheus全链路监控报警,在当今云原生时代可观测领域,Prometheus + Grafana 成为可观测性事实标准. 采集数据:运维团队可以使用 Prometheus 监控云原生 K ...
- 记录一次金仓V8R3数据库坏块处理过程、PostgreSQL数据库适用
因数广政务云华为业务存储固件升级,导致数据库产生坏块,业务SQL查询报错如下: ERROR: missing chunk number 0 for toast value 38166585 in SY ...
- easyre-153
这里也是没有做出来,因为有隐藏函数的原因(第一次见) 攻防世界XCTF 3rd-RCTF-2017 easyre153学习笔记_rhelheg-CSDN博客 攻防世界逆向高手题之easyre-153- ...