(三)mongoDB增、删、改、查

mongodb

2018年03月07日 09时31分40秒


插入基础

db.集合名称.insert({“字段名称” : 插入数据});

// 插入一个文档
db.blog.insert({"url" : "www.baidu.com"});
// 插入多个文档
db.blog.insert([
{"url" : "www.shifeng.com"},
{"url" : "www.xinlang.com"}]);

查询

基础查询find()、findOne()

find()查询返回所有的字段于所有的文档,findOne()会返回一条文档,pretty()会美化输出,但是pretty()不能与findOne()同时使用,因为findOne()是已经美化输出之后的结果。

固定语法:find的后面的括号中指定的是查询条件,如果括号中什么也不指定会返回所有的文档;{}中可以指定多个查询的条件,为and关系,逻辑运算中有说明。

db.集合名称.find({“字段名称1” : 匹配的数据1,“字段名称2” : 匹配的数据2});

db.blog.find().pretty();
db.blog.find({"url" : "www.baidu.com"});

指定返回的字段

db.集合名称.find({查询条件},{设置显示的字段});

find的第二个字段指定返回的字段,指定为1(返回),0(不返回)

  • 默认_id会返回,指定_id为1,只会返回_id,指定为0,其余字段全部返回
  • 只有_id能够指定为0,其余字段假设有一个或多个指定为1的,则只会返回指定的字段,其余字段不能指定为0,其余字段一个不指定则全部返回。可以使用关系查询中的例子
db.blog.find({"url" : "www.baidu.com"},{"_id" : 0});
db.blog.find({"url" : "www.baidu.com"},{"_id" : 0,"url" : 1});

关系查询

大于($gt)、小于($lt)、大于等于($gte)、小于等于($lte)、不等于($ne)、等于(key:value、$eq)

// 插入数据
db.student.insert({"name" : "张三","sex" : "女","age" : 19,"score" : 89,"address" : "海淀区"});
db.student.insert({"name" : "李四","sex" : "男","age" : 20,"score" : 0,"address" : "朝阳区"});
db.student.insert({"name" : "王五","sex" : "女","age" : 21,"score" : 40,"address" : "东城区"});
db.student.insert({"name" : "马六","sex" : "男","age" : 22,"score" : 60,"address" : "西城区"});
db.student.insert({"name" : "孙七","sex" : "女","age" : 20,"score" : 99,"address" : "海淀区"});
db.student.insert({"name" : "赵八","sex" : "男","age" : 19,"score" : 89,"address" : "东城区"});
db.student.insert({"name" : "钱九","sex" : "女","age" : 21,"score" : 100,"address" : "海淀区"});
db.student.insert({"name" : "刘十","sex" : "男","age" : 20,"score" : 50,"address" : "朝阳区"}); db.student.find({"name" : "张三" });
db.student.find({"age" : {"$gt" : 19}}).pretty();
db.student.find({"score" : {"$gt" : 60}}).pretty();
db.student.find({"name" : {"$ne" : "王五"}}).pretty();

逻辑运算

就三种类型:与($and)、或($or)、非($not、$nor)。

  1. and:是最简单的,只需要用(,)

    db.student.find({“age” : {"$gte" : 19,"$lte" : 20}}).pretty();
  2. or:

    db.student.find({"$or" : [{“age” : {"$gt" : 19}},{“score” : {"$gt" : 90}}]}).pretty();
  3. not:

    db.student.find({"$not" : [{“age” : {"$gt" : 19}},{“score” : {"$gt" : 90}}]}).pretty()

注:逻辑运算or、not都需要跟上数组

db.student.find({“age” : {"$ne" : 19}}).pretty();

求模:

对20 求模等于0的结果

db.student.find({“age” : {"$mod" : [20,0]}}).pretty()

对20 求模不等于0的结果

db.student.find({“age” : {"$not" : {"$mod" : [20,0]}}}).pretty()

$in:

db.student.find({“name” : {"$in" : [“张三”,“李四”,“王五”]}}).pretty()

复杂数据的插入用查询

插入数组

db.student.insert({"name" : "黄大仙-A","sex" : "女","age" : 19,"score" : 89,"address" : "海淀区","course" : ["语文","数学","英语","音乐","政治"]});
db.student.insert({"name" : "黄大仙-B","sex" : "女","age" : 19,"score" : 89,"address" : "海淀区","course" : ["语文","数学","英语"]});
db.student.insert({"name" : "黄大仙-C","sex" : "女","age" : 19,"score" : 89,"address" : "海淀区","course" : ["语文","数学","音乐","政治"]});
db.student.insert({"name" : "黄大仙-D","sex" : "女","age" : 19,"score" : 89,"address" : "海淀区","course" : ["语文","数学","英语","政治"]});
db.student.insert({"name" : "黄大仙-E","sex" : "女","age" : 19,"score" : 89,"address" : "海淀区","course" : ["语文","音乐","政治"]});

数组查询

// 查询学习语文与数学的同学
db.student.find({"course" : {"$all" : ["语文","数学"]}}).pretty() // 既然有数组就可以建立索引(索引下标从0开始,)
// 查询第三个课程为音乐的同学(index=2)
db.student.find({"course.2" : "音乐"}).pretty() // 查询只参加三门课程的学生
db.student.find({"course" : {"$size" : 3}}).pretty() // $slice:限制返回的数组内前两门(2)、后两门(-2)、中间的([1,2](前一个是跳过的,后一个代表返回几个))
db.student.find({"age" : 19},{"course" : {"$slice" : 2}}).pretty()

嵌套集合


db.student.insert({"name" : "流国凳-A","sex" : "女","age" : 20,"score" : 89,"address" : "海淀区",
"course" : ["语文","数学","英语","音乐","政治"],
"parents" : [{"name" : "流国凳-A(父亲)","age" : 51, "job" : "工人"},
{"name" : "流国凳-A(母亲)","age" : 47, "job" : "职员"}
]});
db.student.insert({"name" : "流国凳-B","sex" : "女","age" : 19,"score" : 89,"address" : "海淀区",
"course" : ["语文","数学","英语","音乐","政治"],
"parents" : [{"name" : "流国凳-B(父亲)","age" : 50, "job" : "处长"},
{"name" : "流国凳-B(母亲)","age" : 46, "job" : "局长"}
]});
db.student.insert({"name" : "流国凳-C","sex" : "女","age" : 20,"score" : 89,"address" : "海淀区",
"course" : ["语文","数学","英语","音乐","政治"],
"parents" : [{"name" : "流国凳-C(父亲)","age" : 50, "job" : "工人"},
{"name" : "流国凳-C(母亲)","age" : 48, "job" : "局长"}
]});
db.student.insert({"name" : "流国凳-D","sex" : "女","age" : 20,"score" : 89,"address" : "海淀区",
"course" : ["语文","数学","英语","音乐","政治"],
"parents" : [{"name" : "流国凳-D(父亲)","age" : 49, "job" : "教师"},
{"name" : "流国凳-D(母亲)","age" : 46, "job" : "职员"}
]});
db.student.insert({"name" : "流国凳-E","sex" : "女","age" : 20,"score" : 89,"address" : "海淀区",
"course" : ["语文","数学","英语","音乐","政治"],
"parents" : [{"name" : "流国凳-E(父亲)","age" : 48, "job" : "处长"},
{"name" : "流国凳-E(母亲)","age" : 48, "job" : "职员"}
]});

嵌套集合查询

// 查询年龄大于19,且父母有人是局长的人(对嵌套JSON的访问需要用到$elemMatch)
db.student.find(
{"$and" :
[
{"age" :
{"$gte" : 19}
},
{"parents" :
{"$elemMatch" :
{"job" : "处长"}
}
}
]
}
).pretty() // 字段判断
// 查找父母信息存在的人的信息
db.student.find(
{"parents" :
{"$exists" : true}
}
).pretty()
// course不存在的信息
db.student.find(
{"course" :
{"$exists" : false}
}
).pretty() // 条件查询(where子句) // 年龄大于20的
db.student.find({"$where" : "this.age>20"}).pretty() db.student.find(
{"$where" :
function(){
return this.age>20;
}
}
).pretty()
// 查询大于19,小于21的
db.student.find({
"$and" :
[
{"$where" : "this.age>19"},
{"$where" : "this.age<21"}
]
}
).pretty();

**注:**在mongo中最好不用where,因为对mongo的索引不兼容,会降低查询速度

特定类型的查询

正则运算

基础语法:{key : 正则标记}

完整语法:{key : {"$regex" : 正则标记 ,"$options" : 选项}}

“i”:忽略字母大小写

"m":多行查找

"x":空白字符除了被转义的和在字符集以外的完全忽略

"s":匹配所有字符(圆点“.”),包括换行内容

需要注意的是如果直接使用javascript那么只能使用i和m,而s和x必须使用$regex

// 查询以‘流’开头的姓名
db.student.find({"name" : /流/}).pretty()
// 模糊查询简化格式
db.student.find({"name" : /a/i}).pretty()
// 完整格式
db.student.find({"name" : {"$regex" : /a/i}}).pretty() // 查询数组数据
db.student.find({"caurse" : /语?/}).pretty()

数据排序

排序操作使用sort()可以有两个排序,升序(1),降序(-1)

// 对成绩降序排序:
db.student.find().sort({"score" : -1}).pretty()
// 在排序中会有一种自然排序(按照数据的保存顺序排序)
db.student.find().sort({"$natural" : -1}).pretty()

分页显示

skip(n):跨过多少数据行

limit(n):返回数据行的限制

// 第一页
db.student.find().skip().limit(5).sort({"age" : -1}).pretty()
// 第二页
db.student.find().skip(5).limit(5).sort({"age" : -1}).pretty()

数据的更新

更新基础语法

更新操作,共有两类函数save()、update()

**语法:**db.集合.update(更新对象、新的对象数据(更新操作符),upsert,multi);

upsert:更新的数据如果不存在则增加一天新的数据(true为增加,false为不增加)

multi:表示是否只更新满足条件的第一行数据,如果为false则只更新一条,如果为true,全更新。

// 将年龄为19的人的成绩都更改为100分,只更新返回的第一条
db.student.update({"age" : 19},{"$set" : {"score" : 100}},false,false) // 满足条件的都更新:
db.student.update({"age" : 19},{"$set" : {"score" : 100}},false,true) // 更新不存在的数据:
db.student.update({"age" : 30},{"$set" : {"name" : "不存在"}},true,false);
db.student.find({"name" : "不存在"});

复杂更新、删除(修改器)

1、增加已有键的数值值($inc)

$inc:主要是对于一个数字字段(必须为数字字段),增加某个数字字段的数据内容,如果这个字段不存在则创建它

语法:{"$inc" : {“成员” : “内容”}}

db.student.update({"age" : 19},{"$inc" : {"score" : -30,"age" : 1}});

2、修改一个字段的值($set)

$set:进行内容的重新设置,如果这个字段不存在则创建它

语法:{"$set" : {“成员” : “新内容”}}

db.student.update({"age" : 20},{"$set" : {"score" : 89}});

3、删除某一个文档的字段($unset)

$unset:删除某个成员的内容

语法:{"$unset" : {“成员” : 1}}

// 删除张三的成绩与年龄
db.student.update({"name" : "张三"},{"$unset" : {"age" : 1,"score" : 1}});

4、追加一个内容到数组($push)

$push:相当于是将内容追加到指定的成员之中(基本是数组),就是一个对数组数据的添加的,如果没有数组就进行一个新的数组的创建

语法:${"$push" : {“成员” : value}}

// 向张三的数据里面追加数组课程数据
db.student.update({"name" : "张三"},{"$push" : {"course" : ["语文","数学"]}});
db.student.find({"name" : "张三"}).pretty();
// 根据内容就可以看到是两个数组 // 向李四追加一门课程数据
db.student.update({"name" : "李四"},{"$push" : {"course" : "语文"}});
db.student.find({"name" : "李四"}).pretty(); // 向黄大仙-B追加一门政治:
db.student.update({"name" : "黄大仙-B"},{"$push" : {"course" : "政治"}});
db.student.find({"name" : "黄大仙-B"}).pretty();

5、追加多个内容到数组($pushAll)

$pushAll:类似的可以一次追加多个内容到数组里面

语法:${"$pushAll" : {“成员” : 数组内容}};

// 向王五添加多个课程
db.student.update({"name" : "王五"},{"$pushAll" : {"course" : ["美术","音乐","素描"]}});
db.student.find({"name" : "王五"}).pretty();

6、向数组中添加一个不存在的内容($addToSet)

$addToSet:向数组里面添加一个内容,只有内容不存在的情况下才添加

语法:{"$addToSet" : {“成员” : “内容”}}

// 向王五的信息里增加新的内容
db.student.update({"name" : "王五"},{"$addToSet" : {"course" : "跳舞"}});
db.student.update({"name" : "王五"},{"$addToSet" : {"course" : "美术"}});
db.student.find({"name" : "王五"}).pretty();

7、删除数组中的第一或最后一个数据($pop)

$pop:删除数组内的数据

语法:{"$pop" : {“成员” : 内容}},内容如果设置为-1,则是删除第一个课程

// 删除王五的第一个课程
db.student.update({"name" : "王五"},{"$pop" : {"course" : -1}});
db.student.find({"name" : "王五"}).pretty(); // 删除王五的最后一个课程
db.student.update({"name" : "王五"},{"$pop" : {"course" : 1}});
db.student.find({"name" : "王五"}).pretty();

8、删除数组中的一个指定内容($pull)

$pull:从数组中删除一个指定内容的数据

语法:{"$pull" : {“成员” : 内容}},进行数据对比,如果没有匹配的数据则什么也不做

// 删除王五的跳舞课程
db.student.update({"name" : "王五"},{"$pull" : {"course" : "跳舞"}});
db.student.find({"name" : "王五"}).pretty();

9、删除数组中的多个内容($pullAll)

$pullAll:一次性删除多个内容

语法:{"$pull" : {“成员” : [数据,数据,数据……]}}

// 删除黄大仙-A中的三门课程
db.student.update({"name" : "黄大仙-A"},{"$pullAll" : {"course" : ["语文","数学","英语"]}})
db.student.find({"name" : "黄大仙-A"}).pretty();

10、修改字段的key($rename)

$rename:为成员名称重命名

语法:{"$rename" : {旧的成员名称 : 新的成员名称}}

// 将name字段对应为"张三"的文档的"name"key修改为"newname"
db.student.update({"name" : "张三"},{"$rename" : {"name" : "newname"}})
db.student.find({"newname" : "张三"}).pretty()
// 或
db.student.find().sort({"$natural" : -1}).pretty();

索引

MongoDB中存在两种索引:自动创建的索引与手动创建的索引

db.student.drop()
db.student.insert({"name" : "张三","sex" : "女","age" : 19,"score" : 89,"address" : "海淀区"});
db.student.insert({"name" : "李四","sex" : "男","age" : 20,"score" : 0,"address" : "朝阳区"});
db.student.insert({"name" : "王五","sex" : "女","age" : 21,"score" : 40,"address" : "东城区"});
db.student.insert({"name" : "马六","sex" : "男","age" : 22,"score" : 60,"address" : "西城区"});
db.student.insert({"name" : "孙七","sex" : "女","age" : 20,"score" : 99,"address" : "海淀区"});
db.student.insert({"name" : "赵八","sex" : "男","age" : 19,"score" : 89,"address" : "东城区"});
db.student.insert({"name" : "钱九","sex" : "女","age" : 21,"score" : 100,"address" : "海淀区"});
db.student.insert({"name" : "刘十","sex" : "男","age" : 20,"score" : 50,"address" : "朝阳区"}); // 查看当前的索引
db.student.getIndexes();

索引创建

db.student.ensureIndex({列:1});

在这儿1表示索引按照升序排列,降序为-1

使用上面的方法创建的索引是默认命名的

// 1、使用下面的函数可以对当前索引进行分析:
db.student.find({"age" : 19}).explain();
// 2、对没有索引的score字段进行查询分析
db.student.find({"score" : {"$gt" : 60}}).explain();
// 3、对索引和费索引进行复合查询,可以看出(过滤操作索引不会启用)
db.student.find({"$or" :
[
{"age" : {"$gt" : 19}},
{"score" :{"$gt" : 60}}
]
}).explain();
// 可以强制使用索引
db.student.find({"$or" :
[
{"age" : {"$gt" : 19}},
{"score" :{"$gt" : 60}}
]
}).hint({"age" : -1,"score" : -1 }).explain();

删除索引

在集合中创建过多的索引会照成性能的下降

// 删除单个索引:
db.student.dropIndex({"age" : -1});
// 删除所有索引:
db.student.dropIndexes();

索引

(三)MongoDB增、删、改、查的更多相关文章

  1. MongoDB增 删 改 查

    增 增加单篇文档 > db.stu.insert({sn:'001', name:'lisi'}) WriteResult({ "nInserted" : 1 }) > ...

  2. 好用的SQL TVP~~独家赠送[增-删-改-查]的例子

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  3. iOS sqlite3 的基本使用(增 删 改 查)

    iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...

  4. iOS FMDB的使用(增,删,改,查,sqlite存取图片)

    iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...

  5. django ajax增 删 改 查

    具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...

  6. ADO.NET 增 删 改 查

    ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...

  7. MVC EF 增 删 改 查

    using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...

  8. python基础中的四大天王-增-删-改-查

    列表-list-[] 输入内存储存容器 发生改变通常直接变化,让我们看看下面列子 增---默认在最后添加 #append()--括号中可以是数字,可以是字符串,可以是元祖,可以是集合,可以是字典 #l ...

  9. Java操作MongoDB:连接&增&删&改&查

    1.连接 ①方式一 MongoClientOptions.Builder builder = MongoClientOptions.builder(); //可以通过builder做各种详细配置 Mo ...

  10. oracle 11g 建库 建表 增 删 改 查 约束

    一.建库 1.(点击左上角带绿色+号的按钮) 2.(进入这个界面,passowrd为密码.填写完后点击下面一排的Test按钮进行测试,无异常就点击Connect) 二.建表 1-1. create t ...

随机推荐

  1. vue工具 - vue/cli@3.xx 安装使用流程

    mac安装记得npm前边加sudo 安装脚手架,用于生成目录 npm install -g @vue/cli 安装用于编译单个的.vue文件 npm install -g @vue/cli-servi ...

  2. C# byte数组与16进制间的相互转换

      1.byte数组转16进制字符串 /// <summary> /// 将一个byte数组转换成16进制字符串 /// </summary> /// <param na ...

  3. springboot自定义页面拦截

    项目结构图 页面拦截代码 @Configuration public class WebConfig implements WebMvcConfigurer { @Override public vo ...

  4. 不用FTP,直接Windows与Linux下互传文件

    直接上传文件到Linux[1] Linux上输入命令:rz 直接下载Linux中的文件[2] 使用命令: sz 文件名 网上看到这个帖子,觉得很实用,转载保存 下载一个部署文件夹,到本地电脑 . 两步 ...

  5. 【Activiti学习之七】BPMN子流程、顺序流、流程关口

    环境 JDK 1.8 MySQL 5.6 Tomcat 7 Eclipse-Luna activiti 6.0 一.子流程 1.嵌入子流程2.调用子流程3.事件子流程4.事务子流程 二.顺序流1.条件 ...

  6. 笔记:Map(就是用来Ctrl+C,V的)

    JDK1.8:List -> Map: 1,Map<String, String> maps = userList.stream().collect(Collectors.toMap ...

  7. Ansible14:Playbook条件语句

    目录 简介 when关键字 1. when基本使用 2. 比较运算符 3. 逻辑运算符 条件判断与tests 判断变量 判断执行结果 判断路径 判断字符串 判断整除 其他tests 条件判断与bloc ...

  8. OpenCV 静态库 CMAKE 文件

    cmake_minimum_required(VERSION 3.12)project(computer_cv) set(CMAKE_CXX_STANDARD 11) find_package(Ope ...

  9. 开源规则引擎 Drools 学习笔记 之 -- 1 cannot be cast to org.drools.compiler.kie.builder.impl.InternalKieModule

    直接进入正题 我们在使用开源规则引擎 Drools 的时候, 启动的时候可能会抛出如下异常: Caused by: java.lang.ClassCastException: cn.com.cheng ...

  10. 图像上划凸多边形(convexHull()函数)

    import numpy as npimport cv2 as cvimg=np.zeros((400,410),np.uint8)points=np.random.randint(100,400,( ...