(三)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. docker 部署 jenkins

    建议使用的Docker映像是jenkinsci/blueocean image(来自 the Docker Hub repository). 该镜像包含当前的长期支持 (LTS) 的Jenkins版本 ...

  2. springboot事务

    参考: 1.https://www.cnblogs.com/kesimin/p/9546225.html https://www.cnblogs.com/east7/p/10585724.html

  3. 第02组 Alpha冲刺(3/6)

    队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 摸鱼 提交记录(全组共用) 接下来的计划 沟通前后端成员,监督.提醒他们尽快完成各自的进度 学习如何评估代码质量 准备Al ...

  4. LOAM笔记

    CSDN有篇结合paper分析代码的博文,下面是我对paper的理解: 1. 综述 整个LOAM本质就是一个激光里程计,没有闭环检测,也就没有图优化框架在里面,该算法把SLAM问题分为两个算法同时运行 ...

  5. 应用JWT进行用户认证及Token的刷新

    本文将通过实际的例子来演示如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新方案(ASP.NET Core 系列目录) 一.什么是JWT? JWT(json web token ...

  6. dockerfile 的问题 FROM alpine:3.8 temporary error (try again later)

    FROM alpine:3.8 apk add xxx安装软件 fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX ...

  7. Docker 常用命令速查手册

    记录一下docker的日常使用命令,本文主要针对linux + mac操作系统而言,window是否适用不太确定,谨慎使用 1. docker进程 docker进程启动.停止.重启,常见的三种case ...

  8. Android集成C程序访问驱动设备节点

    1.前言 Android系统中,应用程序一般是使用Java语言进行开发的,但是通过C语言也可以进行Android中的可执行程序开发,接下来,将简单介绍在Android系统中如何通过C程序来访问内核中s ...

  9. C中关键字inline用法

    一.什么是内联函数 在C语言中,如果一些函数被频繁的调用,不断地用函数入栈,即函数栈,则会造成栈空间或者栈内存的大量消耗,为了解决这个问题,特别的引入了inline关键字,表示为内联函数.栈空间指的是 ...

  10. Buttons按扭

    到目前为此,我们已经写了一些程序代码,但都只是输出,然而,有时我们也希望板子能处理一些输入,输入输出我们都是针对板子来说的.microbit板子上的两个按键是最显眼的输入,分别是A和B,mPython ...