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","age":18,"create":new Date()})
    


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

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

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

1.2、insertMany多条插入数据

  1. json数组插入多条数据

    db.member.insertMany([{"_id":2,"name":"李四","age":18,"create":new Date()},{"_id":3,"name":"王五","age":18,"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'}],age:18},{name:"D",job:[{city:"beijing",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",phone:"13101010101",name:"LiuBei",status:"created",shippingFee:10,orderLines:[{product:"Huawei Meta30 Pro",sku:"2002",qty:100,price:6200,cost:5699},{product:"Huawei Meta40 Pro",sku:"2003",qty:10,price:7200,cost:6699},{product:"Huawei Meta40 5G",sku:"2004",qty:80,price:4200,cost:3800}]},{orderNo:"000003",phone:"13101010101",name:"LiuBei",status:"created",shippingFee:10,orderLines:[{product:"Huawei Meta30 Pro",sku:"2002",qty:100,price:6400,cost:5799},{product:"Huawei Meta40 Pro",sku:"2003",qty:10,price:7400,cost:6799},{product:"Huawei Meta40 5G",sku:"2004",qty:80,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 '}', got 'EOF' at end of input: unwind:{path:'tag’}},{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则显示,展开时保留空数组,或者不存在数组字段的文档。如图

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

  1. mongodb java 多条件查询_MongoDB查询之高级操作详解(多条件查询、正则匹配查询等)...

    MongoDB查询之高级操作 语法介绍 MongoDB查询文档使用find()方法,同时find()方法以非结构化的方式来显示所有查询到的文档. -- 1.基本语法 db.collection.fin ...

  2. Oracle数据库(一):安装函数查询条件查询

    文章目录 1.课程总介绍 Oracle由来&埃里森的身世 为什么学习Oracle 2.Oracle安装与配置 3.正式学习部分 Oracle体系结构 Oracle和MYSQL的差别 SQL的简 ...

  3. day01 与MySQL的第一次亲密接触基础查询条件查询

    <尚硅谷>MySQL系统课程一共6天,下面介绍第1天的学习内容,主要涉及MySQL的内容介绍.进阶1基础查询和进阶2条件查询.干货满满,跟着课程的进度来的,可能篇幅略长,但是看完一定会有收 ...

  4. MySQL:单表查询---简单查询+条件查询+高级查询+表和字段取别名

    目录 一.通用模版展示 简单查询 条件查询 高级查询 表和字段取别名 二.举例说明 简单查询 条件查询 高级查询 表和字段取别名 三.注意事项 四.Mapper简单举例 简单查询 条件查询 高级查询 ...

  5. mongo 查询显示字段_MongoDB查询指定字段(field)返回指定字段的方法

    使用MongoDB的时候需要只查询指定的字段进行返回,也就是类似mysql里面的 SELECT id,name,age 这样而不是SELECT *.在MongoDB里面映射(projection)声明 ...

  6. Mysql 拼接多个字段作为查询条件查询方法

    最近工作中需要把多个字段拼接作为查询条件查询,特此记录便于日后查阅. <select id="listByProgramCodeList" resultType=" ...

  7. mysql 查询两个字段相同的数据_sql语句如何查询一个表中某两个字段的相同数据?...

    查询一个表中某两个字段的相同数据代码是:Select Name,ID From A group by Name,ID having count (*)>1. 结构化查询语言(Structured ...

  8. query builder python-elasticsearch返回指定字段

    1. postman 请求elasticsearch 返回指定字段 1.直接在请求体当中,json 数据,对应的是一个列表 { "_source":["title&quo ...

  9. MySQL-数据查询操作-基本查询-条件查询-排序查询

    文章目录 ==基础查询== 语法.特点.注意事项 案例 ==条件查询== 语法 按条件表达式筛选 按逻辑表达式筛选 模糊查询 ==排序查询== 语法特点 案例 基础查询 案例所使用表字段介绍: 语法. ...

最新文章

  1. EMNLP'21 | 基于相似样本检索的在线更新机器翻译系统
  2. eclipse svn 与资源库同步 符号说明
  3. Linux2.6内核 -- 编码风格(3)
  4. 键盘修饰符以及自定义键盘修饰符——自定义全局按键修饰符 || 自定义指令
  5. Java中的Atomic包使用指南
  6. android炫酷叼ui,XUI: 一个简洁而优雅的Android原生UI框架,解放你的双手!
  7. Idea利用maven打包spring boot项目
  8. 字节缓冲流 BufferedInputStream java
  9. 青少年迷恋上短视频 如何防沉迷?
  10. 瑞星布局:安全软件的时尚模式
  11. Android studio SweetAlert for Android
  12. 服务器ip维护无法登录,用DHCP解决服务器硬件管理口没有设置IP无法登录的问题...
  13. python 邻接矩阵_阿里巴巴举荐,Python视频,免费分享,用python求解特征向量和拉普拉斯矩阵...
  14. AKKA文档(java)——术语,概念
  15. Atitit.软件控件and仪表盘(23)--多媒体子系统--视频输出切换控制cvbs av s-video Ypbpr pal ntsc
  16. 2021年中国研究生数学建模竞赛D题参考思路
  17. red5流媒体服务器系统,red5 流媒体服务器配置
  18. Rexroth力士乐工控机触摸屏维修SYSTEM200概述
  19. 通过DLL文件实现函数共有及通过调用_stdcall来减少程序文件的大小
  20. 【苹果家庭群发推】创作AppleScript脚本来控制MacOS附有的iMessage客户端停止考据,近似于组iMessage

热门文章

  1. js的validate插件异步效验
  2. SAP 谈谈存货分析报表
  3. 按头安利 好看又实用的运动健身 体育海报模板素材看这里
  4. 公网IP/内网IP:
  5. 安卓手机突然很卡_为什么你的安卓手机越用越卡,真是内存不够?终于找到原因了!...
  6. 找不到Vivado卸载程序的解决方案
  7. 全球与中国钠还原剂市场深度研究分析报告
  8. TCP/IP详解(二)数据链路层
  9. OFFICE 您正试图运行的函数包含有宏或需要宏语言的解决方法
  10. java8中的流(Stream)