MongoDB 添加、查询(条件查询、排序、分页、返回指定字段)、修改、删除数据、聚合aggregate

MongoDB内部支持JavaScript语法,使用SpiderMonkey作为内部的JavaScript解释器引擎。

1、常用命令

  • show databases:显示数据库列表
  • use:切换数据库
  • show collections:显示数据库列表
  • show users:显示当前数据库的用户列表
  • show roles:显示当前数据库的角色列表

连接MongoDB

mongo‐‐host <HOSTNAME> ‐‐port <PORT>

在这里插入图片描述

1、添加数据

添加数据并不需要像mysql一样,必须要先创建表

1.1、insertOne/insert单条插入

插入单条数据

db.集合.insertOne(<JSON对象>)

示例:

  1. 不指定 _id
    db.member.insertOne({"name":"张三","age":18,"create":new Date()})
    
    db.member.insert({"name":"李四1","create":new Date()})
    

    在这里插入图片描述


    不指定主键,MongoDB将默认创建一个主键,字段固定为_id,ObjectId 前四个字节代表了主键生成的时间,精确到秒。主键ID在客户端驱动生成,一定程度上代表了顺序性,但不保证顺序性,可以通过ObjectId(“id值”).getTimestamp() 获取创建时间。

    在这里插入图片描述

  2. 指定 _id
    db.member.insertOne({"_id":1,"name":"张三","create":new Date()})
    

    在这里插入图片描述

acknowledged : true,标识插入成功
insertedId:返回创建的id

1.2、insertMany多条插入数据

  1. json数组插入多条数据

    db.member.insertMany([{"_id":2,"name":"李四","create":new Date()},{"_id":3,"name":"王五","create":new Date()}])
    

    在这里插入图片描述

  2. 脚本的方式插入多条数据

    var names = ['张一','张二'];
    
    var members = [];
    
    var member ={};
    
    for(var i=0;i<2;i++){
     var member ={name:names[i],"age":[i],"create":new Date()};
     members.push(member);
    };
    db.member.insertMany(members);
    

    在这里插入图片描述

2、查询

2.1、查询全部数据

db.集合名.find()
例如查询:member集合中所有数据

db.member.find()

在mongo shell中默认显示20条数据,输入it命令读取下一批;当在Navicat中会一次性返回;

在这里插入图片描述

在这里插入图片描述

2.2、指定条件查询

注意find查询条件中是一个对象

  • 查询age=18
    db.member.find({age:18});
    

    在这里插入图片描述

  • 查询 _id>2 并且 age =18
    db.member.find({_id :{$gt: 2}, age:18});
    

    在这里插入图片描述

2.3、排序

sort中对象的值

  • -1 是降序
  • 1是升序
db.member.find({_id :{$gt: 2}}).sort({_id:-1});

在这里插入图片描述

2.4、分页

skip:跳过指定记录数

limit:返回结果数量

db.member.find().skip(1).limit(5);

跳过第1条,一共查询3条数据

在这里插入图片描述

2.5、返回指定字段

0代表不显示,1代表显示。

注意:_id默认是显示的,只有_id不显示是设置0,其他字段都不可以设置0

find({查询条件,可以空},{显示的字段:1})

在这里插入图片描述

2.6、查询操作符

mongo操作符 描述 对比mysql
$eq 等值比较,find({_id :{ $eq: 1}}) 等价于 find({_id : 1}) id = 1
$ne 不等于指定值,find({_id :{ $ne: 1}}) id != 1 或 id<> 1
$in 数组中包含 ,find( { _id :{ $in: [ 1,2 ] } } ) id in ( 1,2 )
$nin 数组中不包含,find( { _id :{ $nin: [ 1,2 ] } } ) id not in ( 1,2 )
$gt 大于指定值,find({_id :{$gt: 1}}) id > 1
$get 大于等于指定值,find({_id :{$gte: 1}}) id >= 1
$lt 小于指定值,find({_id :{$lt: 1}}) id < 1
$lte 小于等于指定值,find({_id :{$lte: 1}}) id <= 1
$and 与(并且)查询,find({$and:[ { _id:{ $gt:1} },{ _id:{ $lt:4} } ]}) id > 1 and id < 4
$or 或查询,find({$or:[ { _id:1 },{ _id: 3} ]}) id = 1 or id= 3
$not 非查询,非小于3的数据 find({_id :{$not :{ $lt: 3 } } }) id >= 3
$nor 即非查询,find( { $nor: [ { _id: 1 },{ _id: 2 },{ _id: 3 }] } ) (id != 1 and id !=2 and id !=3)
$all 同时包含,查询tag同时包含3和9的数据,tag是一个数组,find({tag:{$all:[3,9]}}),可查看下面示例
$elemMatch 有一个元素匹配即可,find({job:{$elemMatch:{city:‘beijing’,company:‘xiaomi’}}}),可查看下面示例
$size 匹配数组大小,find({tag:{$size:3}}),可查看下面示例
$slice 返回数组中第几个元素,find({job:{KaTeX parse error: Expected 'EOF',got '}' at position 43: …ompany:'baidu'}}̲},{name:1,job:{slice:1}}),可查看下面示例
$exists 匹配是否包含查询字段的文档,find({name:{$exists:true}})
  • $all查询

    db.member.insertMany([{name:"A",tag:[1,2,3],age:18},{name:"B",tag:[3,5,9],age:19}]);
    db.member.find({tag:{$all:[3,9]}})
    

    在这里插入图片描述

  • $elemMatch查询
    匹配嵌套数组中至少有一个对象完全匹配

    db.member.insertMany([{name:"C",job:[{city:"beijing",company:'baidu'},{city:"shenzhen",company:'huawei'}],{name:"D",company:'xiaomi'}],age:19}])
    
    db.member.find({job:{$elemMatch:{city:'beijing',company:'baidu'}}})
    
    db.member.find({job:{$elemMatch:{city:'beijing',company:'huawei'}}})
    
    db.member.find({job:{$elemMatch:{city:'beijing',company:'xiaomi'}}})
    

    在这里插入图片描述

  • $size,匹配嵌套的数组大小

    在这里插入图片描述

  • $slice

    • 值 > 0,返回数组的几个元素
    • 值 < 0,返回数组的倒数几个元素

      在这里插入图片描述

3、修改

db.集合.update(query,update,options)

参数说明

  • query:更新的查询条件
  • update:要更新的内容
  • options:更新的选项

操作符

操作符 格式 描述
$set { $set : { filed : value} } 指定一个键,并更新值
$unset { $unset : { filed : 1} } 删除一个键
$inc { $inc : { filed : value} } 对数值类型进行增减
$push { $push : { filed : value} } 将数值追加到数组中,若数组不存在则会进行初始化
$pushAll { $pushAll : { filed : value_array} } 追加多个值到数组内
$pull { $pull : { filed : value} } 从数组中删除指定元素
$addToSet { $addToSet : { filed : value} } 添加元素到数组中,具有排重功能
$pop { $pop : { filed : 1} } 删除数组第一个或最后一个
$rename { $rename : { old_filed_name : new_filed_name } } 修改地段名称
$bit { $bit : { filed : {and :5} } } 位操作,integer类型

3.1、更新单个文档

更新_id等于3的名字

db.member.update({_id:3},{$set:{name:‘张五1’}})

db.member.updateOne({_id:3},{$set:{name:‘张五1’}})

在这里插入图片描述

3.2、multi更新多个文档

更新多个文档需要设置 multi选项 :true默认情况下mongo update命令在更新第一个文档后就返回。

db.member.update({age:19},{$set:{ name:‘zhang1’}},{‘multi’:true});

db.member.updateMany({age:19},{$set:{ name:‘zhang33’}})

在这里插入图片描述

3.3、upsert更新的字段不存在则插入

upsert选项为true:如果更新文档不存在则创建文档,如果文档存在字段不存在则创建字段,都存在则更新

db.member.update({_id:3},{ $set:{ address :‘北京’} },{upsert:true})

在这里插入图片描述

3.4、findAndModify查询和修改

查询并修改指定值,注意先返回结果,后更新,返回的结果是旧数据

db.member.findAndModify({query:{name:‘张1’},update:{ $set:{ ‘age’:18 } } })

在这里插入图片描述

查询并修改指定值,并返回新值

db.member.findAndModify({query:{name:‘张1’},update:{ $set:{ ‘age’:18 } } })

在这里插入图片描述

3.5、count

在这里插入图片描述


默认情况下 , count不会考虑 skip 和 limit的效果,如果希望考虑 limit 和 skip ,需要设置 为 true。
分布式环境下,count不保证数据的绝对正确

4、删除数据

4.1、删除单个文档

db.member.deleteOne({_id:2})

在这里插入图片描述

remove命令会删除匹配条件的全部文档,删除单个文档,可以根据_id 或者唯一值删除。

db.member.remove({name:‘张1’})

在这里插入图片描述


如果希望明确删除一个文档,需要指定justOne参数

db.member.remove({age:19},true)

在这里插入图片描述

4.2、删除多个文档

db.member.remove({age:19})

db.member.deleteMany({age:19})

在这里插入图片描述

4.3 删除全部文档

db.member.remove({})

db.member.deleteMany({})

db.member.drop()

remove与deleteMany是对查询范围内的数据逐条删除,drop是删除整个集合(包括全部索引)drop更高效

4.5、删除并返回删除的数据findOneAndDelete

remove和deleteMany只能按照默认顺序删除,并返回确认信息。findOneAndDelete可以指定顺序删除文档和返回删除的内容

删除并返回

db.member.findOneAndDelete({age:18})

在这里插入图片描述

删除指定排序的数据

db.member.findOneAndDelete({age:18},{sort:{_id:-1}})

在这里插入图片描述

5、聚合

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。

聚合表达式:

  • 获取字段信息
    $<field> : 用 $ 指示字段路径,注意使用""
    $<field>.<sub field> : 使用 $ 和 . 来指示内嵌文档的路径

  • 常量表达式
    $literal :<value> : 指示常量 <value>

  • 系统变量表达式
    $$ 使用 $$ 指示系统变量
    $$CURRENT 指示管道中当前操作的文档

创建订单数据

db.orders.insertMany(
  [
    {
    orderNo:"000001",
    phone:"13101010101",
    name:"LiuBei",
    status:"created",
    shippingFee:10,
    orderLines:[
        {product:"Huawei Meta30 Pro",sku:"2002",qty:100,price:6000,cost:5599},
        {product:"Huawei Meta40 Pro",sku:"2003",qty:10,price:7000,cost:6599},
        {product:"Huawei Meta40 5G",sku:"2004",qty:80,price:4000,cost:3700}
    ]
    },
    {
    orderNo:"000002",price:6200,cost:5699},price:7200,cost:6699},price:4200,cost:3800}
    ]
    },

    {
    orderNo:"000003",price:6400,cost:5799},price:7400,cost:6799},price:4400,cost:3900}
    ]
    }
  ]
);

5.1、统计总数

统计所有订单销售价格和成本价格的总和

db.orders.aggregate([{$addFields: {
  totalPrice:{  $sum: "$orderLines.price"},
  totalCost: {  $sum: "$orderLines.cost"},
}}]).pretty();

$addFields:临时添加字段到返回的文档中
$sum:统计字段的总数
pretty():返回结构化数据

在这里插入图片描述


统计所有订单销售价格和成本价格的总和并按照,销售价格totalPrice倒序排列

db.orders.aggregate(
[
	{$addFields: {
		  totalPrice:{  $sum: "$orderLines.price"},
		  totalCost: {  $sum: "$orderLines.cost"},
		}
	},{
		$sort: {
	        totalPrice: -1
	    }
	}
]).pretty();

在这里插入图片描述

  1. 聚合中方法对应的值必须是集合中的字段例如:$sum: “$orderLines.price”,嵌套类型使用 $ 和 . 来指示内嵌文档的路径
  2. 先聚合,再排序

5.2、$project:重命名和隐藏或显示字段

重命名

将name重命名为nickName

db.member.aggregate({KaTeX parse error: Expected '}',got 'EOF' at end of input: …ect:{nickName:'name’}})

在这里插入图片描述

隐藏或显示字段

显示_id与name,_id默认显示

db.member.aggregate({$project:{name:1}})

在这里插入图片描述

5.3、$match:匹配,同find()一样的参数

db.member.aggregate({$match:{name:‘张5’}})

在这里插入图片描述


联合使用

在这里插入图片描述


多条件使用

db.member.aggregate({KaTeX parse error: Expected '}',got 'EOF' at end of input: match:{and :[{name:‘张5’},{age:‘185’}]}})
db.member.aggregate({KaTeX parse error: Expected '}',got 'EOF' at end of input: match:{or :[{name:‘张5’},{age:‘186’}]}})

在这里插入图片描述

5.4、$limit:限制结果数量

db.member.aggregate({$limit:3})

在这里插入图片描述

5.5、$skip:忽略结果的数量

db.member.aggregate({$skip:1})

在这里插入图片描述

5.6、$sort:按照给定的字段排序结果

db.member.aggregate({$sort:{_id:1}})

在这里插入图片描述

5.7、$group:按照给定表达式组合结果

对于group ,聚合操作主要有以下几种

  • $addToSet :将分组中的元素添加到一个数组中,并且自动去重
  • $avg 返回分组中的平均值, 非数值直接忽略
  • $first 返回分组中的第一个元素
  • $last 返回分组中的最后一个元素
  • $max 返回分组中的最大元素
  • $min 回分组中的最小元素
  • $push 创建新的数组,将值添加进去
  • $sum 求分组数值元素和

以name分组,统计shippingFee的和

db.orders.aggregate([{$group:{_id:'$name',totlaShippingFee:{$sum:'$shippingFee'}}}])

在这里插入图片描述

5.8、$unwind:将数组打平,才分成多条数据

将tag数组拆分成多条数据,并匹配_id等于3的数据

db.member.aggregate([{KaTeX parse error: Expected '}',got 'EOF' at end of input: unwind:{path:'tag’}},{$match:{_id:3}}])

在这里插入图片描述


将tag数组拆分成多条数据,并匹配_id等于3同时tag等于2的数据

db.member.aggregate([{KaTeX parse error: Expected '}',{KaTeX parse error: Expected '}',got 'EOF' at end of input: match:{and:[{_id:3},{tag:2}]}}])

在这里插入图片描述


includeArrayIndex: 显示数组对应的索引值, 赋值给后面指定的字段

db.member.aggregate([{$unwind:{path:'$tag',includeArrayIndex:'tagIndex'}},{$match:{_id:3}}])

在这里插入图片描述


NumberLong:标识当前tag的值在原来数组中第一个位置

preserveNullAndEmptyArrays:true:path对应的字段如果在查询数据中没有,默认是不显示的,设置true则显示,展开时保留空数组,或者不存在数组字段的文档。如图

在这里插入图片描述

原文地址:https://blog.csdn.net/Extraordinarylife/article/details/126295359

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的数据库,创建在关系模型(二维表模型)基础上,一般面向于记录SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作主流的关系数据库包括Oracle、Mysql、SQL Server、Microsoft Access、DB2等非关系型数据库NoSQL(nOSQL=Not Only SQL),意思是“不仅仅是SQL”,是非关系型数据库的总称。除了主流的关系型数据库外的数据库,都认为是非关系型主流的NoSQ.._redis是非关系型数据库吗
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒杀是很常见的营销场景,在一定时间内有大量的用户访问商场下单,主要需要解决的问题有两个:1. 高并发对数据库产生的压力;2. 竞争状态下如何解决商品库存超卖;高并发对数据库产生的压力对于第一个问题,使用缓存来处理,避免直接操作数据库,例如使用 Redis。竞争状态下如何解决商品库存超卖对于第二个问题,需要重点说明。常规写法:查询出对应商品的库存,判断库存数量否大于 0,然后执行生成订单等操作,但是在判断库存是否大于 0 处,如果在高并发下就会有问题,导致库存_php库存结余并发
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB,MongoRepository的方式访问较为简单,MongoTemplate方式较为灵活,这两种方式在Java对于MongoDB的运用中相辅相成。_springboot插入指定的mongodb数据库
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的特点是可以存储非结构化的数据,并且可以处理大量的数据。HBase是一个分布式、可扩展的列式存储系统,它是基于Google的Bigtable设计的。HBase是一个开源的NoSQL数据库,它的核心功能是提供高性能的随机读写访问。在本文中,我们将对比HBase与其他NoSQL数据库,例如Redis、MongoDB、Cass...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn-scram-sha-1
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无法获取数据,只能试试monstache抽取mongodb数据,但是monstache需要mongodb replica set 模式才能采集数据。############monstache-compose文件。#replicas set 启动服务。# 默认备份节点不能读写,可以设置。# mydb指的是需要同步的数据库。#登录主mongodb初始化rs。#primary 创建用户。# ip地址注意要修改。# ip地址注意要修改。_monstache csdn
文章浏览阅读913次,点赞4次,收藏5次。storage:fork: trueadmin登录切换数据库注意: use 代表创建并使用,当库中没有数据时默认不显示这个库删除数据库查看表清单> show tables # 或者 > show collections表创建db.createCollection('集合名称', [options])table1字段类型描述capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。_mongodb5
文章浏览阅读862次。Centos7.9设置MongoDB开机自启(超全教程,一条龙)_mongodb centos开机启动脚本
文章浏览阅读1.3k次,点赞6次,收藏21次。NoSQL数据库使用场景以及架构介绍
文章浏览阅读856次,点赞21次,收藏20次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的设计目标是为了解决传统关系型数据库(如MySQL、Oracle等)在处理大量不结构化数据方面的不足。NoSQL数据库可以处理大量数据,具有高性能、高可扩展性和高可用性。但是,与关系型数据库不同,NoSQL数据库没有固定的模式,数据结构也不一定是表格。在NoSQL数据库中,数据存储和查询都是基于键值对、列族、图形等不同的...
文章浏览阅读416次。NoSQL定义:非关系型、分布式、开放源码和具有横向扩展能力的下一代数据库。由c++编写的开源、高性能、无模式的基于分布式文件存储的文档型数据库特点:高性能、高可用性、高扩展性、丰富的查询支持、可替换已完场文档某个指定的数据字段应用场景:社交场景:使用mongodb存储用户信息游戏场景:用户信息,装备积分物流场景:订单信息,订单状态场景操作特点:数据量大;读写操作频繁;价值较低的数据,对事物性要求不高开源、c语言编写、默认端口号6379、key-value形式存在,存储非结构化数据。_nosql
文章浏览阅读1.5k次,点赞3次,收藏2次。Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket. at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:110) at redis.clients.jedis.Connection.connect(Conne_redis.clients.jedis.exceptions.jedisconnectionexception: failed to create so
文章浏览阅读6.5k次,点赞3次,收藏12次。readAnyDatabase(在所有数据库上都有读取数据的权限)、readWriteAnyDatabase(在所有数据库上都有读写数据的权限)、userAdminAnyDatabase(在所有数据库上都有管理user的权限)、dbAdminAnyDatabase(管理所有数据库的权限);:clusterAdmin(管理机器的最高权限)、clusterManager(管理和监控集群的权限)、clusterMonitor(监控集群的权限)、hostManager( 管理Server);_mongodb创建用户密码并授权
文章浏览阅读593次。Redis是一个基于内存的键值型NoSQL数据库,在实际生产中有着非常广泛的用处_搭建本地redis
文章浏览阅读919次。Key 的最佳实践[业务名]:[数据名]:[id]足够简短:不超过 44 字节不包含特殊字符Value 的最佳实践:合理的拆分数据,拒绝 BigKey选择合适数据结构Hash 结构的 entry 数量不要超过 1000(默认是 500,如果达到上限则底层会使用哈希表而不是 ZipList,内存占用较多)设置合理的超时时间批量处理的方案:原生的 M 操作Pipeline 批处理注意事项:批处理时不建议一次携带太多命令。Pipeline 的多个命令之间不具备原子性。_redis高级实战
文章浏览阅读1.2k次。MongoDB 递归查询_mongodb数据库 递归
文章浏览阅读1.2k次。通过实际代码例子介绍:如何通过MongoTemplate和MongoRepository操作数据库数据_springboot操作mongodb
文章浏览阅读687次,点赞7次,收藏2次。首先欢迎大家阅读此文档,本文档主要分为三个模块分别是:Redis的介绍及安装、RedisDesktopManager可视化工具的安装、主从(哨兵)模式的配置。_redis 主从配置工具
文章浏览阅读764次。天下武功,无坚不摧,唯快不破!我的名字叫 Redis,全称是 Remote Dictionary Server。有人说,组 CP,除了要了解她外,还要给机会让她了解你。那么,作为开发工程师的你,是否愿意认真阅读此心法抓住机会来了解我,运用到你的系统中提升性能。我遵守 BSD 协议,由意大利人 Salvatore Sanfilippo 使用 C 语言编写的一个基于内存实现的键值型非关系(NoSQL)..._redis 7.2 源码
文章浏览阅读2k次。MongoDB 的增删改查【1】_mongodb $inc