【MongoDB详细使用教程】一、Mac安装MongoDB

【MongoDB详细使用教程】二、MongoDB基本操作

【MongoDB详细使用教程】三、高级查询

【MongoDB详细使用教程】四、python操作MongoDB

【MongoDB详细使用教程】五、MongoDB的数据库管理

1、使用比较运算符查询

MongoDB 运算
$gt 大于
$lt 小于
$gte 大于等于
$lte 小于等于欧
$ne 不等于
db.集合名.find({"键名": {比较运算符1:值1, 比较运算符2:值2} })
> db.students.find()
{ "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
{ "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
{ "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级" }
{ "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级" } > db.students.find({"age": {$lt:19}})
{ "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" } > db.students.find({"age": {$gte:18,$lt:20}})
{ "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
{ "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }

2、使用关键字查询

2.1、in/not in 关键字

db.集合名.find({"键名": {$in:[值1, 值2, 值3 ...]} })

db.集合名.find({"键名": {$nin:[值1, 值2, 值3 ...]} })
> db.students.find({"age":{$in:[19,18,17]}})
{ "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
{ "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" } > db.students.find({"age":{$nin:[19,18,17]}})
{ "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级" }
{ "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级" }

2.2、size 关键字

对于值为list的字段,可以对list的长度(即list当中值的个数)进行判断来查询。

db.集合名.find({"键名": {$size:n} })
> db.students.find()
{ "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
{ "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
{ "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }
{ "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] } # 查找text字段长度为3的数据
> db.students.find({"text":{$size:3}})
{ "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] }

2.3、exists 关键字

查询 包含/不包含 某个字段的数据

db.集合名.find({"键名": {$exist: true|fase} })   # t、f要小写
> db.students.find()
{ "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
{ "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
{ "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }
{ "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] } # 查询包含text字段的数据
> db.students.find({"text":{$exists:true}})
{ "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }
{ "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] }
# 查询不含text字段的数据
> db.students.find({"text":{$exists:false}})
{ "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
{ "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }

2.4、or 关键字

db.集合名.find({$or:[{条件1}, {条件2}, {条件3}...]})
> db.students.find()
{ "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
{ "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
{ "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }
{ "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] } # 查询包含text字段或者name=chen的数据
> db.students.find({$or:[{"text":{$exists:true}},{"name":"chen"}]})
{ "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
{ "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }
{ "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] }

3、模糊查询

db.集合名.find({"键名": js正则表达)
> db.students.find()
{ "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
{ "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
{ "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }
{ "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] }
{ "_id" : ObjectId("5db68d190f98841018f76970"), "name" : "cheng", "age" : 21, "grade" : "四年级" } # 查询name以che开头的数据
> db.students.find({"name":/che/})
{ "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
{ "_id" : ObjectId("5db68d190f98841018f76970"), "name" : "cheng", "age" : 21, "grade" : "四年级" }

4、查询结果排序

db.集合名.find().sort({"键名": 1|-1, "键名": 1|-1...})

 1 为升序
-1 为降序
> db.students.find().sort({"name":1, "age":-1})
{ "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
{ "_id" : ObjectId("5db68f6c0f98841018f76971"), "name" : "cheng", "age" : 22, "grade" : "五年级" }
{ "_id" : ObjectId("5db68d190f98841018f76970"), "name" : "cheng", "age" : 21, "grade" : "四年级" }
{ "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] }
{ "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
{ "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }

5、限定返回结果数量

db.集合名.find().limit(n)

db.集合名.find().skip(n)  # 跳过n条,返回从n+1k开始的数据

db.集合名.find().skip(n).limit(m)  # 跳过n条,返回后面的m条

.limit() 与 .sort()无先后顺序

# 按age正序排列,并返回前两行数据
> db.students.find().limit(2).sort({"age":1})
{ "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
{ "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
> db.students.find().sort({"age":1}).limit(2)
{ "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
{ "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" } # 查询age第二小和第三小的数据
> db.students.find().skip(1).limit(2).sort({"age":1})
{ "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
{ "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }

6、查询返回结果数量

db.集合名.find().count()

db.集合名.find().skip(n).count(true)  # 与skip结合使用时,要加true
> db.students.find({"name":"cheng"}).count()
2
> db.students.find().count()
6 # 不加true就会统计全部数据条目
> db.students.find().skip(2).count()
6
> db.students.find().skip(2).count(true)
4

7、聚合函数aggregate()

7.1、语法

db.集合名.aggregate([
{ 管道1: {表达式1} },
{ 管道1: {表达式1} },
{ 管道1: {表达式1} },
...
]) # 如果只有一个管道则去掉"[]"

在aggregate()函数中,数据会依次通过每个管道进行筛选过滤,因此称其为管道。

7.2、常用管道

管道 说明
$group 将集合中的文档分组,可用于统计结果
$match 过滤数据,只输出符合条件的文档
$project 修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
$sort 将输入文档排序后输出
$limit 限制聚合管道返回的文档数
$skip 跳过指定数量的文档,并返回余下的文档
$unwind 将数组类型的字段进行拆分

7.3、常用聚合函数

只能在$group管道中使用。

分组函数 说明
$sum 计算总和,$sum:1同count表示计数
$avg 计算平均值
$min 获取最小值
$max 获取最大值
$push 在结果文档中插入值到一个数组中,相当于拼接字段
$first 根据资源文档的排序获取第一个文档数据
$last 根据资源文档的排序获取最后一个文档数据

7.4、实例

$group

db.集合名.aggregate(
{$group:
{
_id:'$字段名', 别名:{$聚合函数:'$字段名'}
}
}

根据_id后的字段名进行分组,对聚合函数后的字段名进行聚合运算。

  • 如果分组后,要对全部数据进行聚合运算,则 $聚合函数:1,相当于sql中的 count(1)
# 统计男女生人数
db.singer.aggregate(
{$group:
{
_id:'$sex',
count_sex:{$sum:1}
}
}
);
___________________________________
{ "_id" : "女", "count_sex" : 4 }
{ "_id" : "男", "count_sex" : 11 }

$sum:1 的作用是统计数量

$sum:'$字段名' 则是字段值进行累加

  • 因为聚合函数只能在group管道中使用,如果要对全部数据进行聚合运算(即不分组),则 _id:null .
# 统计所有人平均年龄
db.singer.aggregate(
{$group:
{
_id:null,
总人数:{$sum:1},
avg_age:{$avg:"$age"},
min_age:{$min:"$age"},
max_age:{$max:"$age"}
}
}
);
_______________________________________________________
{ "_id" : null, "总人数" : 15, "avg_age" : 42.666666666666664, "min_age" : 29, "max_age" : 55 }

这里直接使用中文进行重命名

  • 用$push输出分组后的全部值
# 统计男女生人数及男女生名单
db.singer.aggregate(
{$group:
{
_id:"$sex",
人数:{$sum:1},
名单:{$push:"$name"}
}
}
);
________________________________________________________________________________
{ "_id" : "女", "人数" : 4, "名单" : [ "李宇春", "赵丽颖", "黄龄", "王菲" ] }
{ "_id" : "男", "人数" : 11, "名单" : [ "刘德华", "张学友", "黎明", "郭富城", "薛之谦", "周杰伦", "PSY", "杰克逊", "杨坤", "刘欢", "林志炫" ] }

++$push:"$字段名"++ 相当于mysql中的 ++group_concat(字段名)++ 和 oracle中的 ++wmsys.wm_concat(字段名)++

$match

db.集合名.aggregate(
{$match:{"键名":{表达式}}},
);
# 查找age大于40的数据
db.singer.aggregate(
{$match:
{"age":{$gt:40}}
}
);

$unwind

db.集合名.aggregate(
{$unwind:"键名"}
);

$unwind会将值为数组(列表)的字段进行拆分,数组中的每个值都与该行数据的其他字段组成一行新的数据。

> db.singer.find({"name":"刘德华"})
————————————————————————————————
{ "_id" : ObjectId("5db78dcb25fcb93e108d6dcb"), "num" : "1", "name" : "刘德华", "country" : "中国", "sex" : "男", "age" : 55, "score" : 100, "works" : [ "爱你一万年", "忘情水", "来生缘", "我不够爱你" ], "description" : "1961年9月27日出生于中国香港,演员、歌手、作词人、制片人,影视歌多栖发展的代表艺人之一。" } # 将刘德华的works字段拆分
db.singer.aggregate([
{$match:{"name":"刘德华"}},
{$unwind:"$works"}
]);
——————————————————————————————
{ "_id" : ObjectId("5db78dcb25fcb93e108d6dcb"), "num" : "1", "name" : "刘德华", "country" : "中国", "sex" : "男", "age" : 55, "score" : 100, "works" : "爱你一万年", "description" : "1961年9月27日出生于中国香港,演员、歌手、作词人、制片人,影视歌多栖发展的代表艺人之一。" }
{ "_id" : ObjectId("5db78dcb25fcb93e108d6dcb"), "num" : "1", "name" : "刘德华", "country" : "中国", "sex" : "男", "age" : 55, "score" : 100, "works" : "忘情水", "description" : "1961年9月27日出生于中国香港,演员、歌手、作词人、制片人,影视歌多栖发展的代表艺人之一。" }
{ "_id" : ObjectId("5db78dcb25fcb93e108d6dcb"), "num" : "1", "name" : "刘德华", "country" : "中国", "sex" : "男", "age" : 55, "score" : 100, "works" : "来生缘", "description" : "1961年9月27日出生于中国香港,演员、歌手、作词人、制片人,影视歌多栖发展的代表艺人之一。" }
{ "_id" : ObjectId("5db78dcb25fcb93e108d6dcb"), "num" : "1", "name" : "刘德华", "country" : "中国", "sex" : "男", "age" : 55, "score" : 100, "works" : "我不够爱你", "description" : "1961年9月27日出生于中国香港,演员、歌手、作词人、制片人,影视歌多栖发展的代表艺人之一。" }

管道组合应用

# 查询年龄大于30的男女生人数
db.singer.aggregate([
{$match:{"age":{$gt:30}}},
{$group:{_id:"$sex",人数:{$sum:1}}}
]);
————————————————————————————————
{ "_id" : "女", "人数" : 2 }
{ "_id" : "男", "人数" : 11 }
# 查询年龄在30岁以上,年龄第二小和第三小的人
db.singer.aggregate([
{$match:{"age":{$gt:30}}},
{$project:{_id:0,name:1,age:1}},
{$sort:{"age":1}},
{$skip:1},
{$limit:2}
]);
——————————————————————
{ "name" : "薛之谦", "age" : 33 }
{ "name" : "周杰伦", "age" : 37 }

$project用来设定哪些字段显示,哪些不显示,并可以设置字段显示顺序。1为显示,0为不显示。

这里要注意,在$project后面_id字段默认显示,其他字段默认不显示。

8、创建索引

db.集合名.ensureIndex({"键名1":1|-1, "键名2":1|-1})
> db.students.ensureIndex({"name":1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}

【MongoDB详细使用教程】三、高级查询的更多相关文章

  1. 【MongoDB详细使用教程】二、MongoDB基本操作

    目录 数据类型 数据库操作 集合操作 数据操作 增 查 改 修改整行 修改指定字段的值 删 数据类型 MongoDB常见类型 说明 Object ID 文档ID String 字符串,最常用,必须是有 ...

  2. 【MongoDB详细使用教程】四、python操作MongoDB

    目录 1.安装pymongo 2.连接数据库 3.操作数据库 3.1.查 3.2.增 3.3.改 3.4.删 使用第三方库pymongo来实现python对MongoDB的操作 pymongo官方文档 ...

  3. 【MongoDB详细使用教程】五、MongoDB的数据库管理

    目录 1.数据库安全 1.1.创建管理员账号和密码 1.2.设置服务状态为需要验证用户 1.3.创建用户账户和密码 1.4.忘记密码/修改密码 2.主从服务器 2.1.创建服务器目录,用于分别存放主从 ...

  4. WindowsServer2012 R2 64位中文标准版(IIS8.5)下手动搭建PHP环境详细图文教程(二)安装IIS8.5

    //来源:http://www.imaoye.com/Technology/WindowsServer2012R264IIS85.html 阿里云服务器ECS Windows Server 2012 ...

  5. MongoDB高级查询详细

    前言 前几篇,老玩家绕道即可,新手晚上闲着也是蛋疼,不如把命令敲一边,这样你就会对MongoDB有一定的掌握啦.如果没有安装MongoDB去看我的上一篇博客  MongoDB下载安装与简单增删改查 前 ...

  6. mongodb进阶一之高级查询

    上篇文章我们讲了mongodb的crud基本操作 http://blog.csdn.net/stronglyh/article/details/46812579 这篇我们来说说mongodb的进阶-- ...

  7. mongodb高级查询

    前几篇,老玩家绕道即可,新手晚上闲着也是蛋疼,不如把命令敲一边,这样你就会对MongoDB有一定的掌握啦.如果没有安装MongoDB去看我的上一篇博客  MongoDB下载安装与简单增删改查 前奏:启 ...

  8. MongoDB学习笔记三:查询

    MongoDB中使用find来进行查询.查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数决定了要返回哪些文档,其形式也是一个文档,说明要执行的查询细节.空的查询 ...

  9. MongoDB高级查询用法大全

    转载 http://blog.163.com/lgh_2002/blog/static/440175262012052116455/ 详见官方的手册: http://www.mongodb.org/d ...

随机推荐

  1. stl源码学习(版本2.91)--list

    stl源码学习(版本2.91)--list 一,阅读list()构造函数的收获 1,默认构造函数的作用和被调用的时机 struct no{ no(int i){} //no(){ // std::co ...

  2. Host '10.133.3.34' is not allowed to connect to this MySQL server mysql 本地拒接连接

    mysql 本地拒接连接 解决方案是,把mysql库中的user表的host 改成% 运行所电脑连接 也可以把第一行复制一遍  把localhost改成你要连接电脑的ip(推荐这改,这样安全一点) 改 ...

  3. mysql 插入表情数据报错

    mysql 插入表情数据报错 1.编码类型改成:utf8mb4 2.连接类型也要改成:utf8mb4_general_ci 3.在每个保存的前面执行一次 self.cursor.execute('SE ...

  4. C++ class内的 < 和 > 重载,大于号,小于号,重载示例。

    #include <iostream> // overloading "operator = " outside class // < 和 > 是二元操作符 ...

  5. 元昊讲django框架

    一 什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有 ...

  6. luoguP2178 [NOI2015]品酒大会(后缀数组做法)

    题意 因为一个\(k\)相似必定为\(k-1,k-2....0\)相似,对于一个\(lcp\)为\(k\)后缀对\((i,j)\),我们只用把它的贡献加在\(k\)的答案上,最后求一个后缀和和后缀ma ...

  7. 正睿暑期培训day1考试

    链接 A 理解一下题意,然后玩几组样例就能发现,实际上就是\(k\)个\(i\)等价于\(1\)个\(i-1\).所以就类似于\(k\)进制进行进位,如果最后\(0\)位上不是\(0\),那么就存在划 ...

  8. Codeforces Round #573 (Div. 2) Tokitsukaze and Mahjong 水题

    B. Tokitsukaze and Mahjong time limit per test1 second memory limit per test256 megabytes Tokitsukaz ...

  9. 解决node fs.writeFile 生成csv 文件乱码问题

    解决node fs.writeFile 生成csv 文件乱码问题: fs.writeFile('xxx.csv', '\ufeff' + 要传入的数据, {encoding: 'utf8'}); \u ...

  10. C#教程之C#属性(Attribute)用法实例解析

    引用:https://www.xin3721.com/ArticlecSharp/c11686.html 属性(Attribute)是C#程序设计中非常重要的一个技术,应用范围广泛,用法灵活多变.本文 ...