①语法
db.collection.find(query, projection)
②参数

query :可选,使用查询操作符指定查询条件

projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

指定需要返回的键

在find方法的第二个参数进行指定。默认情况下,始终会返回"_id",可以通过设置字段为0来表示不返回这个字段。

db.students.find().pretty() --返回所有

db.students.find({}).pretty() --返回所有

db.students.find({条件,不写查询所有},{"name":1}).pretty() --返回name字段和_id字段

db.students.find({条件,不写查询所有},{"name":1,"_id":0}).pretty() --只返回name字段

按条件查询
db.students.find({"age":19}).pretty()
db.students.find({"age":19,"score":100}).pretty()   并且的关系
 
比较运算符:$lt小于,$lte小于等于,$gt大于,$gte大于等于,$ne不等于,$eq等于
db.students.find({age : {$gt : 100}})
db.students.find({age : {$gt : 100,$lt:105}})  区间
 
 
逻辑运算符:$and,$or,$not
db.col.find({$and:[{"age":19},{"name":"张三"}]}).pretty()

$not   不能用在顶级操作符,必须是正则或者文档

db.students.find({"age":{&not:{&eq:18}}}).pretty()

db.students.find({"age":{&not:/18/}}).pretty()
 

范围运算符:$in包含,$nin不包含

--查询姓名叫"张三","李四","王五"的人

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

--查询姓名不叫"张三","李四","王五"的人

db.students.find({"name":{"$nin":["张三","李四","王五"]}}).pretty();

 
求模运算符:$mod[将查询的值除以第一个给定的值,如果余数等于等二个值则匹配成功]

--查询年龄20岁,余数为0的人,即20

db.students.find({"age":{"$mod":[20,0]}}).pretty();

--查询年龄20岁,余数为1的人,即21

db.students.find({"age":{"$mod":[20,1]}}).pretty();

字段判断$exists:检查某个键是否存在,1表示存在,0表示不存在

db.students.find({"name":{"$exists":1}}).pretty();

null类型:不仅能匹配键的值为null,还匹配键不存在的情况

db.students.find({"name":null}).pretty();

正则表达式

如果要想实现模糊查询,那么必须使用正则表达式,而且正则表达式使用的是语言Perl兼容的正则表达式的形式。如果要想实现正则使用,则按照如下的定义格式:

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

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

|- 对于options主要是设置正则的信息查询的标记:

|- "i":忽略字母大小写;

|- "m"多行查找;

|- "x":空白字符串除了被转义的或在字符类中意外的完全被忽略;

|- "s":匹配所有的字符(圆点、"."),包括换行内容。

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

查询 title 包含"教"字的文档:

db.students.find({name:/教/})

db.students.find({name:/教/i})

db.students.find({"name":{"$regex":/教/i}})

查询 title 字段以"教"字开头的文档:

db.students.find({title:/^教/})

查询 titl e字段以"教"字结尾的文档:

db.students.find({title:/教$/})

数组查询:$all、$size、$slice、$elemMatch

db.students.insert({"name":"大神-A","course":["语文","数学","英语","政治","历史"]});

1:单个元素匹配,就跟前面写条件一样,{key:value}

db.students.find({"course":"语文"}).pretty();

2:多个元素匹配,使用$all, {key:{$all:[a,b]}},元素的顺序无所谓

--查询同时有语文、数学的课程

db.students.find({"course":{"$all":["语文","数学"]}});

3:可以使用索引指定查询数组特定位置, {"key.索引号":value}

--查询数组中第二个内容(index= 1,索引下标从0开始)为数学的信息

db.students.find({"course.1":"数学"});

4:查询某个长度的数组,使用$size

--要求查询出只参加两门课程的学生

db.students.find({"course":{"$size":2}})

5:指定子集,使用$slice,正数是前面多少条,负数是尾部多少条,也可以指定偏

--返回年龄为19岁所有学生的信息,但是要求只显示前两门参加课程

db.students.find({"age":19},{"course":{"$slice":2});

--返回年龄为19岁所有学生的信息,但是要求只显示后两门参加课程

db.students.find({"age":19},{"course":{"$slice":-2});

--取出中间部分的信息【第一个数据表示跳过的数据量,而第二个数据表示返回的数量】

db.students.find({"age":19},{"course":{"$slice":[1,2]});

6:可以使用$来指定符合条件的任意一个数组元素,如:{"users.$":1}

7:$elemMatch:要求同时使用多个条件语句来对一个数组元素进行比较判断

数组范围查询-- 例如 大于4小于5  应该是没有值的   匹配规则是数大于4的有没有、小于4的有没有

db.students.insert("name":"张三--学生","parents":[{"name":"张三--父亲","job":"经理"},{"name":"张三--母亲","job":"职员"}]);
db.students.find({"parents":{"$elemMatch":{"job":"经理"}});
 

查询内嵌文档

1:查询整个内嵌文档与普通查询是一样的

2:如果要指定键值匹配,可以使用"." 操作符,比如:{"name.first":"a" ,"name.last":"b"}

3:如果要正确的指定一组条件,那就需要使用$elemMatch,以实现对内嵌文档的多个键进行匹配操作

注意:内嵌文档的查询必须要整个文档完全匹配

条件过滤__$where {了解}

在查询中执行任意的JavaScript,通过编程来解决查询的匹配问题,方法返回boolean值。

function t1(){

for(var a in this){

if(a.name=="张三--学生"){

return true;

}

}

return false;

}

使用的时候:db.users.find({"$where":t1});

注意:$where性能较差,安全性也是问题,所以不到万不得已,不要使用

数据排序sort

在MongoDB里面数据的排序操作使用"sort()"函数,在进行排序的时候可以有两个顺序:升序(1)、降序(-1)。

范例:数据排序

db.students.find().sort({"score":-1});

但是在进行排序的过程里面有一种方式称为自然排序,按照数据保存的先后顺序排序,使用"$natural"表示。

范例:自然排序

db.students.find().sort({"$natural":-1});

查询记录条数的命令:count

1:直接使用count()的话,得到的是整个记录的条数

db.students.find().count();         --共6条数据

db.students.find().limit(2).count();--共6条数据

2:如果要获取按条件查询后记录的条数,需要指定count(true或者非0的数)

限制返回的记录条数的命令:limit(要返回的条数)

db.students.find().limit(2).count(true);--共2条数据

限制返回的记录条数起点的命令:skip(从第几条开始返回)

db.students.find().skip(4).limit(2);--返回跳过前四条之后的2条数据【5、6】

排序的命令:sort({要排序的字段:1为升序,-1为降序})

1:可以对多个字段进行排序

db.students.find().sort({"name":1});

2:MongoDB处理不同类型的数据是有一定顺序的,有时候一个键有多种类型的值,其排序顺序是预先定义好的,从小到大如下:

(1)最小值(2)null (3)数字(4)字符串(5)对象/文档(6)数组(7)二进制数据(8)对象id(9)布尔类型(10)日期型(11)时间戳(12)正则表达式(13)最大值

分页查询:组合使用limit,skip和sort

当然也可以使用其他方式来分页,比如采用自定义的id,然后根据id来分页

查询给定键的所有不重复的数据,命令:distinct

语法:db.runCommand({"distinct":集合名,"key":"获得不重复数据的字段"});

游标【不推荐使用】

1:获取游标,示例如下:

var c = db.users.find();

2:循环游标,可以用集合的方式,示例如下:

while(c.hasNext()){

printjson(c.next());

}

3:也可以使用forEach来循环,示例如下:

c.forEach(function(obj){

print(obj);

});

存储过程【不推荐使用】

1:MongoDB的存储过程其实就是个自定义的js函数

2:使用db.system.js.save({"_id":名称,value:函数});

3:可以通过如下命令查看:db.system.js.find();

4:可以通过如下命令调用:db.eval(名称);

var addF = function(a,b){

return a+b;

};

db.system.js.save({"_id":"MyF","value":addF});

db.system.js.find();

db.eval("MyF(3,5)");

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

第11章:MongoDB-CRUD操作--文档--查询的更多相关文章

  1. 第12章:MongoDB-CRUD操作--文档--查询--游标详解

    ①是什么游标 游标不是查询结果,可以理解为数据在遍历过程中的内部指针,其返回的是一个资源,或者说数据读取接口. 客户端通过对游标进行一些设置就能对查询结果进行有效地控制,如可以限制查询得到的结果数量. ...

  2. SpringMVC MongoDB之“基本文档查询(Query、BasicQuery)”

    一.简介 spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...

  3. 第08章:MongoDB-CRUD操作--文档--删除

    ①语法 remove()  [2.6以后方法过时] deleteOne() [2.6以后官方推荐] deleteMany() [2.6以后官方推荐] db.collection.remove( < ...

  4. 第07章:MongoDB-CRUD操作--文档--创建

    ①语法 insert() save()  --有修改没有新增 insertOne() [3.2版本新增]向指定集合中插入一条文档数据 insertMany() [3.2版本新增]向指定集合中插入多条文 ...

  5. 第10章:MongoDB-CRUD操作--文档--修改--修改器

    ① $set:进行内容的重新设置 语法:{"$set" : {"成员" : "新内容"}}: 范例:将年龄是20岁的人的成绩修改为89 db ...

  6. 第09章:MongoDB-CRUD操作--文档--修改--update

    ①语法 db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boole ...

  7. Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作

    2 Mongodb CRUD 操作 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mong ...

  8. Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)

    一.简单介绍 Spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一 ...

  9. Spring Data MongoDB 三:基本文档查询(Query、BasicQuery

    一.简介 spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...

随机推荐

  1. QQ分享登陆报错

    linker command failed with exit code 1 (use -v to see invocation)报错原因 builtSetting下搜索 bitco 改为NO

  2. java_14.1 判断是否是闰年

    package demo; import java.util.Calendar; import java.util.Scanner; public class Demo { public static ...

  3. 35-BigDecimal详解

    详解 import java.math.BigDecimal; import java.math.BigInteger; import java.util.Scanner; public class ...

  4. ThreeJS中的点击与交互——Raycaster的用法

    基础概念 坐标系 我们的手机屏幕是二维的,但是我们展示物体的世界是三维的,当我们在构建一个物体的时候我们是以一个三维世界既是世界坐标来构建,而转化为屏幕坐标展示在我们眼前,则需要经历多道矩阵变化,中间 ...

  5. 面试题集锦;有关作用域和this的指向

    作用域面试题: 1. fn() function fn () { console.log(12) } var as = function () { console.log(45) } 2. var a ...

  6. 14.Mysql事务控制和锁定

    14.事务控制和锁定存储引擎和锁: MyISAM和MEMORY存储引擎的表支持表级锁: BDB存储引擎的表支持页级锁: InnoDB存储引擎的表支持行级锁.默认情况下,表锁和行锁都是根据执行的语句自动 ...

  7. 关于java.io.IOException: HADOOP_HOME or hadoop.home.dir are not set.的问题

    报错如下: 300 [main] DEBUG org.apache.hadoop.util.Shell - Failed to detect a valid hadoop home directory ...

  8. Rime小狼毫个人配置文件

    default.custom.yaml customization: distribution_code_name: Weasel distribution_version: 0.9.30 gener ...

  9. VirtualBox安装android-x86-4.4-r2

    https://jingyan.baidu.com/album/a681b0de1373133b184346cf.html?picindex=10

  10. LibreOJ 6003. 「网络流 24 题」魔术球 贪心或者最小路径覆盖

    6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 ...