当前位置: 首页 > 编程日记 > 正文

MongoDB系列:二、MongoDB常用操作练习

最近在自学MongoDB,在此记录一下,当做学习笔记了(不断更新中)!!

一、背景

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。它是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

其放弃关系模型的原因就是为了获得更加方便的扩展、稳定容错等特性。面向文档的基本思路就是:将关系模型中的“行”的概念换成“文档(document)”模型。面向文档的模型可以将文档和数组内嵌到文档中。因此,实际中可以用一条数据表示非常复杂的结构。MongoDB没有预定义模式:文档的键(key)和值(value)不再是固定的类型和大小,而且根据需求要添加或者删除字段变得更容易了。

  实际应用中,随着数据量的增大,数据库都要进行扩展。扩展有纵向扩展和横向扩展。纵向扩展是使用计算能力更强的机器,也是最省力的方法,但是很容易达到物理极限,无论花多少钱也买不到最新的机器了。横向扩展就是通过分区将数据分散到更多的机器上。MongoDB的设计采用横向扩展。面向文档的数据模型使它很容易地在多台服务器之间进行数据分割。还可以自动处理跨集群的数据和负载,自动重新分配文档,以及将用户请求路由到正确的机器上。开发者根本不用考虑数据库层次的扩展问题,需要扩展数据库时,在集群中添加机器即可,MongoDB会自动处理后续的事情。 

二、MongoDB的优势与劣势

优势

    1. 快速!基于内存,将热数据存放在物理内存中(不仅仅只是索引和少部分数据),从而提高了整体速度和效率。
    2. 高扩展性!MongoDB的高可用和集群架构拥有十分高的扩展性。
    3. 自身的FailOver机制!在副本集中,当主库遇到问题,无法继续提供服务的时候,副本集将选举一个新的主库继续提供服务。
    4. JSon格式的数据!MongoDB的Bson和JSon格式的数据十分适合文档格式的存储与查询。

劣势

    1. 应用经验少!由于NoSQL兴起时间短,应用经验相比关系型数据库较少。
    2. 由于以往用到的都是关系型数据库,可能会造成使用者一开始的不适应。
    3. 无事务机制!MongoDB本身没有自带事务机制,若需要在MongoDB中实现事务机制,需通过一个额外的表,从逻辑上自行实现事务。

三、MongoDB数据类型

四、常用命令

1)  db:查看当前的数据库;

2)  show dbs:显示所有数据库列表;

3)  db.stats():查看数据库状态;

4)  use:切换到某个数据库;

5)  db.dropDatabase():删除数据库(需要先切换到对应的数据库);(用的时候自己创建)

6)  db.createCollection(name, options):创建集合;(用的时候自己创建)

7)  db.${collection}.drop():删除集合;

8)  db.${collection}.insert():插入文档;

9)  db.${collection}.save():插入文档;

10)   db.${collection}.findOne():查看一篇文档;

11)   db.${collection}.find().pretty():以更加友好的方式查看已插入文档;

12)   db.collection.update():更新文档;

13)   db.collection.remove():删除文档;但是并不会释放存储空间,需执行db.repairDatabase() 来回收磁盘空间。推荐deleteOne(),deleteMany();

14)   db.${collection}.deleteMany({}):删除全部文档

15)   db.${collection}.deleteOne({}):删除符合条件的一个文档

16)   db.${collection}.find().limit(${num}):读取指定数量的数据记录;

17)   db.${collection}.find().limit(${num1}).skip(${num2}):跳过指定数量的数据

18)   db.${collection}.find().sort({${key}:1/-1}):排序,1升序,-1降序

19)   db.${collection}.createIndex():创建索引

20)   db. ${collection}.help();  #查询对相应表的一些操作

21)   db.mycoll.find().help();  #查询的方法,排序,最大最小等...

五、插入

mongoDB中插入数据有insert()与save()两个命令,二者的联系是:

1)  对于数据库中没有改字段,两者没有区别;

2)  对于数据库中有该字段,insert会报错,save会执行更新操作

3)  若新增的数据中存在主键 ,insert() 会提示错误,而save() 则更改原来的内容为新内容。

save()

db.student.save({_id:1,classid:1,age:18,name:"little1",love:["football","swing","cmpgame"]});
db.student.save({_id:2,classid:2,age:19,name:"little2",love:["play"]});
db.student.save({_id:3,classid:2,age:20,name:"little3"});
db.student.save({_id:4,classid:1,age:21,name:"little4"});
db.student.save({_id:5,classid:1,age:22,name:"little5",opt:"woshisheia"});
db.student.save({_id:6,classid:2,age:23,name:"23little4"});

insert():int类型赋值不要加引号,字符串赋值要加引号,单引号和双引号都可以,推荐使用单引号,因为双引号在一些编辑器中转义会有一些问题

1)插入普通数据命令: db.goods.insert({name:'xiaomi',price:2000,number:'50'})

2)插入具有对象数据命令:db.goods.insert({name:'xiaomi',price:2000,number:'50',area:{province:'jiangsu',city:'nanjing'}})

3)插入数组数据命令: db.goods.insert({name:'xiaomi',price:2000,number:'50',area:{province:'jiangsu',city:'nanjing'},color:['black','red','greed']})

4)批量插入数据:for (i=0;i<1000;i++) db.tables1.insert({name:"Alex"+i});

六、查询

1)find({${where条件},${0属性不显示 /1属性显示}}):查询,如果where条件没有,那就用{}表示,不能省略。而显示与否的{}可以省略的。

db.student.find();

//查询 name为little1的学生,并且只显示 age,name两个字段
db.student.find({name:"little1"},{name:1,age:1})       等价于 select name,age from student where name = "little1"

//and:查询 name为little1,age为18的学生,并且只显示 age,name,love三个字段
db.student.find({name:"little1",age:18},{name:1,age:1,love:1})  等价于 select name,age,love from student where name = "little1" and age = 18

//$or:查询 name为little3或age为19的学生
db.student.find({'$or':[{name:'little3'},{age:19}]})  等价于 select * from student where name = "little3" or age = 19

db.student.find({'$or':[{name:'little3'},{age:19}]},{name,1})

2)findOne({${where条件},${0属性不显示 /1属性显示}}):查询,只返回第一个

db.student.findOne().pretty();    这里的pretty()是将结果格式化,find() 与 findOne() 后面都可以使用

3)skip(num): 参数num表示跳过的记录条数,默认值为0。 limit(num):  参数num表示要获取文档的条数,如果没有指定参数则显示集合中的所有文档。skip() 与 limit() 不分先后顺序 ,从第二条查寻,查出三条

db.student.find().skip(1).limit(3);

4)比较运算符号

//查询出19<age<=21的数据
db.student.find({age:{$gt:19,$lte:21}});

//查询age>20的数据
db.student.find({age:{$gt:20}});

db.student.find({$where:"this.age>20"});

db.student.find("this.age>20");

var f = function(){return this.age>20};
db.student.find(f);

5)$mod:查询出age为奇数的数据(对2求余为1即为奇数)(这里请注意[2,1]的位置不能错)。

db.student.find({age:{$mod:[2,1]}});    也可写作:


6)$exists:查询出存在opt字段的数据,  存在true,不存在false

db.student.find({opt:{$exists:true}});    db.student.find({opt:{$exists:false}});


7)查询出name不为little2的数据

db.student.find({name:{$ne:"little2"}});


8)$in:查询出age为16,18,19的数据

db.student.find({age:{$in:[16,18,19]}});


9)$nin:查询出age不为16,18,19的数据

db.student.find({age:{$nin:[16,18,19]}});


10)$size:查询出love有三个的数据

db.student.find({love:{$size:3}});


11)查询出name不是以litt开头的数据

db.student.find({name:{$not:/^litt.*/}});

12)sort:1升序,   -1降序

按age升序:db.student.find().sort({age:1});   按age降序:db.student.find().sort({age:-1});


13)count:查询数据条数。
db.集合名称.find({条件}).count()  或者  db.集合名称.count({条件})

db.student.find().count();  也可以写作db.student.count()

14)like:模糊查询

db.student.find({name:/little/});    相当于 select * from student where name like "%little%";

db.student.find({name:/^little/});    相当于 select * from users where name like "little%";

15)distinct:去重。格式:db.集合名称.distinct('去重字段',{条件})

db.student.distinct('name');

//查找年龄大于18的学生,来自哪些省份

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

16)type:属性类型判断    常见的Double 是1,String是2,Boolean是8,Date是9,Null是10,32位int是16,Timestamp是17,64位int是18

db.sutdent.find({"title" : {$type : 2}})         db.student.find({"title" : {$type : 'string'}})

17)null:查询age为null的数据

db.student.find({age:null})

18)聚合(aggregate),主要用于计算数据,类似sql中的sum()、avg()

 待补

七、更新

update() 方法用于更新已存在的文档。语法格式如下:

复制代码
db.collection.update(<query>,<update>,{upsert: <boolean>,multi: <boolean>,writeConcern: <document>}
)
复制代码

参数说明:

    • query : update的查询条件,类似sql update查询内where后面的。
    • update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
    • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
    • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
    • writeConcern :可选,抛出异常的级别。

例:

db.person.insert([{"name":"chen","age":15},{"name":"li","age":20},{"name":"zhang","age":20}]);

$ set修改符

用于修改键的值,如果键不存在就增加键

//将age=10的数据改成15,默认如果age=10的有多条记录只更新第一条

db.person.update({"name":"li"},{$set:{"age":10}})

//更新多个满足条件的值,同时如果更新的值不存在就插入更新的值,注意:这里插入的值是20不是30

db.person.update({"age":30},{$set:{"age":20}},{multi:true,upsert:true})

可以省略multi,upsert,这里不能有花括号,但是不建议这样做

db.person.update({"age":30},{$set:{"age":20}},true,true)

//值更新为数组

db.person.update({"name":"zhang"},{$set:{"age":[10,12,14]}},{upsert:true})

//修改为其它的值

db.person.update({"name":"zhang"},{$set:{"age":''}},{upsert:true})db.person.update({"name":"zhang"},{$set:{"age":null}},{upsert:true})

$inc修改符

用于增加已有键的值,如果键不存在就创建,只能用于整形、长整型、浮点型。

//将name=zhang的记录的age键+10

db.person.update({"name":"zhang"},{$inc:{"age":10}},{upsert:true})

//将name=zhang的记录的age键-10

db.person.update({"name":"zhang"},{$inc:{"age":-10}},{upsert:true})

$unset修改符

删除键类似关系数据库的删除字段操作,要区别$set修改符的将键设空或者null值

db.person.update({"name":"zhang"},{$unset:{"age":1}})

注:有关数组更新操作的就不在这里说明了!

 

八、删除 

1)删除整体数据

db.goods.remove({name:xiaomi})

2 )删除某条数据的某个字段

db.goods.remove({name:xiaomi},{'$unset':{name:1}})  或  db.goods.remove({name:xiaomi},{'$unset':{name:0}})

注:

1、remove() 方法 并不会真正释放空间。需要继续执行 db.repairDatabase() 来回收磁盘空间。

2、remove() 方法已经过时了,现在官方推荐使用  deleteOne() :删除符合条件的一条数据、 deleteMany()——删除符合条件的多条数据。

九、索引

从mongoDB 3.0开始ensureIndex被废弃,使用 createIndex创建索引。创建索引,需要传递两个参数 ①:建立索引的字段名称,②排序参数   1升序,-1降序。

1)建立单索引。

db.student.createIndex({name:1})   表示给name字段建立索引,按照升序的排序

2)建立复合索引。

db.student.ensureIndex({name:1,age:-1})  建立一个复合索引,表示给name和age都建立索引,按照name的升序,和age的降序

十、总结

转载于:https://www.cnblogs.com/DDgougou/p/10200281.html

相关文章:

递归/回溯:八皇后问题N-Queens

N皇后问题是计算机科学中最为经典的问题之一&#xff0c;该问题可追溯到1848年&#xff0c;由国 际西洋棋棋手马克斯贝瑟尔于提出了8皇后问题。 将N个皇后放摆放在N*N的棋盘中&#xff0c;互相不可攻击&#xff0c;有多少种摆放方式&#xff0c;每种摆 放方式具体是怎样的? 8…

KS103超声波测距模块

max232&#xff1a;电平转换芯片&#xff0c;将电脑的RS-232标准串口&#xff08;高12V&#xff0c;低-12V&#xff09;转换为&#xff08;高5V&#xff0c;低0V&#xff09;。 电脑串口&#xff08;RS -232&#xff09; > 单片机串口&#xff08;TTL串口&#xff09; SIPEX…

linux 硬盘操作,linux常用disk磁盘操作命令

#按照目录大小排序战士最前面15个目录或者文件du -xB M --max-depth2 /var | sort -rn | head -n 15#列出当前所有子目录的文件大小du -h --max-depth1#列出当前文件或者目录最大的10个du -s * | sort -n | tail#按照目录大小从大到小排序du -b --max-depth 1 | sort -nr | per…

在Spring中采用声明式方法对Hibernate和JDBC进行统一的事务配置(AOP)

<?xml version"1.0" encoding"UTF-8"?><beans xmlns"http://www.springframework.org/schema/beans" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:aop"http://www.springframework.…

Leetcode 213.大家劫舍II

打家劫舍II 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈&#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房…

替代Druid,HakariCP 为什么这么快?

这次源码探究,真的感觉看到了无数个小细节,无数个小优化,积少成多。平时开发过程中,一些小的细节也一定要“扣”。

递归/分治:归并排序

前言 分治算法: 将一个规模为N的问题分解为K个规模较小的子问题&#xff0c;这些子问题相互独立且与原问题性质相同。求出 子问题的解后进行合并&#xff0c;就可得到原问题的解。 步骤如下: 分解&#xff0c;将要解决的问题划分成若 干规模较小的同类问题;求解&#xff0c;…

Java中volatile 的使用场景有哪些?

volatile是一种轻量级的同步机制,它能保证共享变量的可见性,同时禁止重排序保证了操作的有序性,但是它无法保证原子性。所以使用volatilevolatile。

JDK22 正式发布了 !

Java 22 除了推出了新的增强功能和特性,也获得 Java Management Service (JMS) 的支持,这是一项新的 Oracle 云基础设施远程软件服务(Oracle Cloud Infrastructure, OCI) 原生服务,提供统一的控制台和仪表盘,帮助企业管理本地或云端的 Java 运行时和应用。使包含运行时计算值的字符串更容易表达,简化 Java 程序的开发工作,同时提高将用户提供的值编写成字符串,并将字符串传递给其他系统的程序的安全性。支持开发人员自由地表达构造器的行为。

Jackson 用起来!

你可以创建自定义序列化器和反序列化器以自定义特定字段或类的序列化和反序列化行为。为此,请创建一个实现或接口的类,并在需要自定义的字段或类上使用和注解。@Override// ...其他代码...优势性能优异:Jackson在序列化和反序列化过程中表现出优秀的性能,通常比其他Java JSON库更快。灵活性:通过注解、自定义序列化器/反序列化器等功能,Jackson提供了丰富的配置选项,允许你根据需求灵活地处理JSON数据。易于使用:Jackson的API设计简洁明了,易于学习和使用。

Swift中的问号?和感叹号!

Swift语言使用var定义变量&#xff0c;但和别的语言不同&#xff0c;Swift里不会自动给变量赋初始值&#xff0c;也就是说变量不会有默认值&#xff0c;所以要求使用变量之前必须要对其初始化。如果在使用变量之前不进行初始化就会报错&#xff1a; var stringValue : String …

拜托!别再滥用 ! = null 判空了!!

另外,也许受此习惯影响,他们总潜意识地认为,所有的返回都是不可信任的,为了保护自己程序,就加了大量的判空。如果你养成习惯,都是这样写代码(返回空collections而不返回null),你调用自己写的方法时,就能大胆地忽略判空)这种情况下,null是个”看上去“合理的值,例如,我查询数据库,某个查询条件下,就是没有对应值,此时null算是表达了“空”的概念。最终,项目中会存在大量判空代码,多么丑陋繁冗!,而不要返回null,这样调用侧就能大胆地处理这个返回,例如调用侧拿到返回后,可以直接。

ffmpeg java linux水印,Linux环境用FFmpeg给视频加水印详细步骤

FFmpeg给视频添加水印&#xff0c;根据官方文档的介绍可以知道FFmpeg在编译安装的时候还需要加 –enable-libfreetype、–enable-libfontconfig、 --enable-libfribidi 这几个参数&#xff0c;而这几个组件又需要从外面编译安装&#xff0c;我看很多博主直接用FFmpeg命令加水印…

red hat DHCP服务器配置

[ 基本操作 ] rpm –q dhcp / rpm -ql grep dhcp [ 查询DHCP ] yum –y install dhcp dhcp -devel service dhcpd start [ 启动 ] service dhcpd status [ 查看DHCP状态 ] chkconfig – level 3 5 dhcpd on [ 改变启动级别为3 5 自动启动服务 ] service ne…

axios解决调用后端接口跨域问题

vue-cli通过是本地代理的方式解决接口跨域问题的。但是在vue-cli的默认项目配置中这个代理是没有配置的&#xff0c;如果现在项目中使用&#xff0c;必须手动配置config/index.js文件 ... proxyTable: {/api: { //将www.exaple.com印射为/apistarget: https://www.example.c…

递归/归并:count of smaller numbers求逆序数

已知数组nums&#xff0c;求新数组count&#xff0c;count[i]代表了在nums[i]右侧且比 nums[i]小的元素个数。 例如: nums [5, 2, 6, 1], count [2, 1, 1, 0]; nums [6, 6, 6, 1, 1, 1], count [3, 3, 3, 0, 0, 0]; nums [5, -7, 9, 1, 3, 5, -2, 1], count [5, 0, 5, 1…

远程计划任务管理

有时你需要远程管理或运行一批机器&#xff0c;但是按要求你没有权限或者不能安装客户端&#xff0c;下面的批处理可能帮上你的忙&#xff0c;将下方代码保存为批处理&#xff0c;并创建Clients.txt&#xff0c;存放的是以回车分隔的IP echo off setlocal enabledelayedexpansi…

linux shell for 循环变量,shell for循环总结

1 shell for循环语法for 变量 in 列表docommand1command2...commandNdone1.1 读取列表中的值#!/bin/bashfor test in apple boy cat dogdoecho The next state is $testdone结果&#xff1a;The next state is appleThe next state is boyThe next state is catThe next state …

自定义堆栈(回文检测)

using System; using System.Collections;namespace CStack {class Program{static void Main(string[] args){CStack alist new CStack();string ch;string word "上海自来水来自海上";bool isPalindrome true;for (int x 0; x < word.Length; x){alist.Push…

二叉树(C++):创建,前中后序遍历(递归+非递归),获取叶子节点个数,获取树的高度

文章目录前言创建二叉树先序遍历中序遍历后序遍历获取叶子节点个数获取树的高度测试代码前言 现有如下二叉树: 关于二叉树的相关操作&#xff0c;我们能够发现二叉树从根节点到子节点&#xff0c;以及每个中间节点基本都能够拆分为若干个子节点的操作&#xff0c;且每个子节点…

6月11号=》121页-125页

6.1  样式单概述 W3C已经给出了两种样式单语言的推荐标准&#xff0c;一种是级联样式单CSS(Cascading Style Sheets)&#xff0c; 另一种是可扩展样式单语言XSL(eXtensible Stylesheet Language)。 6.1.1  CSS CSS主要提供如下两个功能&#xff1a; 1&#xff1a;对页面的字…

linux cp sync,通过SSH使用Rsync传输文件,复制和同步文件及目录

在本文中&#xff0c;我们将解释如何通过SSH使用rsync复制文件。当涉及在网络上的系统之间传输文件时&#xff0c;Linux和Unix用户可以使用许多工具&#xff0c;最流行的数据传输协议是SSH和FTP&#xff0c;虽然FTP很受欢迎&#xff0c;但总是喜欢使用SSH&#xff0c;因为它是传…

【Java笔记】C++与Java的对比

接口&#xff1a; C可以多重继承&#xff0c;而Java不可以。但是Java里一个类可以声明实现多个接口。

cf792b循环链表

头尾链接一下就好&#xff0c; /* 1 2 3 4 5 6 7:4 5 6 7 1 2 3:2 3 5 6 7 1:5 6 7 1 3:6 7 1 3:1 3 7 */ #include<bits/stdc.h> using namespace std; int main(){int n,k,q[200],nxt[200],p,pre,tot;scanf("%d%d",&n,&k);for(int i1;i&…

二叉树:路径之和 Path Sum

给定一个二叉树与整数sum&#xff0c;找出所有从根节点到叶结点的路径&#xff0c;这些路 径上的节点值累加和为sum 即创建一个二叉树&#xff0c;要求二叉树中有一个路径从根节点到叶节点到路径加起来代表到和为 给定的sum 如下二叉树 给定路径之和为18&#xff0c;则需要输…

从零开始编写自己的C#框架(16)——Web层后端父类

从零开始编写自己的C#框架&#xff08;16&#xff09;——Web层后端父类 原文:从零开始编写自己的C#框架&#xff08;16&#xff09;——Web层后端父类 本章节讲述的各个类是后端系统的核心之一&#xff0c;涉及到系统安全验证、操作日志记录、页面与按键权限控制、后端页面功能…

c语言中的普通字符包括什么,【判断题】C语言中的字符常量通常有两种形式:普通字符和转义字符。...

【判断题】C语言中的字符常量通常有两种形式:普通字符和转义字符。更多相关问题&#xff0d;&#xff0d;&#xff0d;Can you speak French&#xff1f;&#xff0d;&#xff0d;&#xff0d;Yes, but only____.A&#xff0e;a littleB&#xff0e;littleC&#xff0e;muchD&a…

Codeforces Round #104 (Div. 2) E DP(01背包模型) +组和+除法取模求逆元

题意&#xff1a; 规定只包含4或7的数为幸运数字&#xff0c;给定n个数的序列&#xff0c;求他的子序列&#xff0c;使得该子序列的长度为k并且满足该子序列中不存在相同的两个幸运数字。问一共寻在多少种可能。&#xff08;只要该数的下标不同则认为是不同的序列&#xff09; …

django 增加验证邮箱功能

在user文件夹下新建python包&#xff0c;utils 在包内新建文件email_send.py,其中包括验证字符串随机码的产生&#xff0c;数据库的存储和email的发送 # -*- coding: utf-8 -*- # 作者&#xff1a;神秘藏宝室 # 日期&#xff1a;2019/1/1 22:21 from random import Random from…

二叉树:最近的公共祖先 Lowest Common Ancestor of a Binary Tree

已知二叉树&#xff0c;求二叉树中给定的两个节点的最近公共祖先。 最近公共祖先: 两节点v与w的最近公共祖先u&#xff0c;满足在树上最低(离根最 远)&#xff0c;且v,w两个节点都是u的子孙。 如上二叉树&#xff0c;6和8号节点的公共祖先有4&#xff0c;1&#xff1b;但是最近…