首页 技术 正文
技术 2022年11月14日
0 收藏 844 点赞 4,574 浏览 9538 个字

(三)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增、删、改、查
索引

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,495
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295