MongoDB干货篇之查询数据

在开始之前我们应该先准备数据方便演示,这里我插入的了几条数据,数据如下:


  1. db.user.insertMany( 
  2. [{ 
  3. name:'jack', 
  4. age:22, 
  5. sex:'Man', 
  6. tags:['python','c++','c'], 
  7. grades:[22,33,44,55], 
  8. school:{ 
  9. name:'shida', 
  10. city:'xuzhou' 
  11. },{ 
  12. name:'jhon', 
  13. age:33, 
  14. sex:null, 
  15. tags:['python','java'], 
  16. grades:[66,22,44,88], 
  17. school:{ 
  18. name:'kuangda', 
  19. city:'xuzhou' 
  20. }, 
  21. name:'xiaoming', 
  22. age:33, 
  23. tags:['python','java'], 
  24. grades:[66,22,44,88], 
  25. school:{ 
  26. name:'kuangda', 
  27. city:'xuzhou' 
  28. )  

find( , )

其中 query 表示查找的条件,相当于 mysql 中 where 子句, projection 列出你想要查找的数据,格式为 db.collection.find(find(<query filter>, <projection>))

实例:

下面不带参数的查找,将会查找出所有的结果


  1.  db.find().pretty(); 
  2.      
  3.     //输出结果 
  4.      
  5.      
  6. {                                                      
  7.         "_id" : ObjectId("59056f81299fe049404b2899"),  
  8.         "name" : "jack",                               
  9.         "age" : 22,                                    
  10.         "tags" : [                                     
  11.                 "python",                              
  12.                 "c++",                                 
  13.                 "c"                                    
  14.         ],                                             
  15.         "grades" : [                                   
  16.                 22,                                    
  17.                 33,                                    
  18.                 44,                                    
  19.                 55                                     
  20.         ],                                             
  21.         "school" : {                                   
  22.                 "name" : "shida",                      
  23.                 "city" : "xuzhou"                      
  24.         }                                              
  25. }  

下面找出满足 name 为 jack 的数据,并且只输出 name , age ,这里的 _id 是默认输出的,如果不想输出将将它设置为 0 ,想要输出那个字段将它设置为1


  1. db.user.find({name:'jack'},{name:1,age:1}) 
  2.  
  3. //输出结果 
  4. { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22 } 
  5.  
  6.  
  7. db.user.find({name:'jack'},{name:1,age:1,_id:0}) 
  8.  
  9. //输出结果 
  10. {"name" : "jack", "age" : 22 }  

**注意这里的一个 projection 不能 同时 指定包括和排除字段,除了排除 _id 字段。 在 显式包括 字段的映射中, _id 字段是唯一一个您可以 显式排除 的。

查询内嵌文档

上述例子中插入的 school 数据就表示内嵌文档

完全匹配查询

完全匹配查询表示 school 中的查询数组必须和插入的数组完全一样,顺序都必须一样才能查找出来


  1. db.user.find({name:'jack',school:{name:'shida',city:'xuzhou'}}); 
  2.  
  3. //输出结果 
  4.  
  5. { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22, "tags" : [ "python", "c++", "c" ],  
  6. "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } } 
  7.  
  8.  
  9. //下面是指定输出的字段,这里的school.name表示只输出school文档中name字段,必须加引号 
  10. db.user.find({name:'jack',school:{name:'shida',city:'xuzhou'}},{name:1,age:1,'school.name':1}); 
  11. //输出结果 
  12. { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22, "school" : { "name" : "shida" } }  

键值对查询

可以通过键值对查询,不用考虑顺序,比如 'school.name':'shida' ,表示查询学校名字为shida 的数据,这里的引号是必须要的


  1. db.user.find({'school.name':'shida'},{name:1,school:1}); 
  2.  
  3. //输出结果 
  4.  
  5. { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "school" : { "name" : "shida", "city" : "xuzhou" } }  

查询操作符

下面我们将配合查询操作符来执行复杂的查询操作,比如元素查询、 逻辑查询 、比较查询操作。我们使用下面的比较操作符 "$gt" 、 "$gte" 、 "$lt" 、 "$lte" (分别对应 ">" 、 ">=" 、 "<" 、 "<=" )

实例

下面查询年龄在 20-30 之间的信息


  1. db.user.find({ 
  2. age:{$gt:20,$lt:30}   
  3. }) 
  4.  
  5. //输出 
  6. { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22, "tags" : [ "python", "c++", "c" ],  
  7. "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }  

$ne

$ne 表示不相等,例如查询年龄不等于 22 岁的信息


  1. db.user.find({age:{$ne:22}}) 
  2.  
  3. //输出 
  4. { "_id" : ObjectId("59057c16f551d8c9003d31e0"), "name" : "jhon", "age" : 33, "tags" : [ "python", "java" ],  
  5. "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }  

slice

$slice 操作符控制查询返回的数组中元素的个数。此操作符根据参数 { field: value } 指定键名和键值选择出文档集合,并且该文档集合中指定 array 键将返回从指定数量的元素。如果 count 的值大于数组中元素的数量,该查询返回数组中的所有元素的。

语法: db.collection.find( { field: value }, { array: {$slice: count }}) ;

下面将查询 grades 中的前两个数


  1. db.user.find({name:'jack'},{grades:{$slice:2},name:1,age:1,'school.name':1}); 
  2.  
  3. //输出,可以看出这里的grades只输出了前面两个 
  4.  
  5. { "_id" : ObjectId("59057c16f551d8c9003d31df"), "name" : "jack", "age" : 22, "grades" : [ 22, 33 ], "school" : { "name" : "shida" } }  

下面将输出后3个数据


  1. db.user.find({name:'jhon'},{grades:{$slice:-3},name:1}); 
  2.  
  3. //输出 
  4. { "_id" : ObjectId("59057c16f551d8c9003d31e0"), "name" : "jhon", "grades" : [ 22, 44, 88 ] }  

下面介绍指定一个数组作为参数。数组参数使用 [ skip , limit ] 格式,其中第一个值表示在数组中跳过的项目数,第二个值表示返回的项目数。


  1. db.user.find({name:'jack'},{grades:{$slice:[2,2]},name:1});  //这里将会跳过前面的两个,直接得到后面的两个数据 
  2.  
  3.  
  4. //输出 
  5.  
  6. { "_id" : ObjectId("59057c16f551d8c9003d31df"), "name" : "jack", "grades" : [ 44, 55 ] }  

$exists

如果 $exists 的值为 true ,选择存在该字段的文档,若值为 false 则选择不包含该字段的文档

下面将会查询不存在sex这一项的信息


  1. db.user.find({sex:{$exists:false}}) 
  2.  
  3. //结果 
  4. { "_id" : ObjectId("59058460fe58ed1089f2a5cd"), "name" : "xiaoming", "age" : 33, "tags" : [ "python", "java" ],  
  5. "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } } 
  6.  
  7.  
  8. db.user.find({sex:{$exists:true}}); 
  9.  
  10. //结果 
  11. { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  
  12. "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } } 
  13. { "_id" : ObjectId("59058460fe58ed1089f2a5cc"), "name" : "jhon", "age" : 33, "sex" : null, "tags" : [ "python", "java" ],  
  14. "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }  

$or

执行逻辑 OR 运算,指定一个至少包含两个表达式的数组,选择出至少满足数组中一条表达式的文档。

语法: { $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }

下面将要查找 age 等于 22 或者 age 等于 33 的值


  1. db.user.find({$or:[{age:22},{age:33}]}) 
  2.  
  3. //结果 
  4.  
  5. { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  
  6. "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } } 
  7. { "_id" : ObjectId("59058460fe58ed1089f2a5cc"), "name" : "jhon", "age" : 33, "sex" : null, "tags" : [ "python", "java" ],  
  8. "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } } 
  9. { "_id" : ObjectId("59058460fe58ed1089f2a5cd"), "name" : "xiaoming", "age" : 33, "tags" : [ "python", "java" ],  
  10. "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }  

下面将会查找出年龄为22或者33并且姓名为 jack 的人的信息


  1. db.user.find({name:'jack',$or:[{age:33},{age:22}]}) 
  2.  
  3. //结果 
  4.  
  5. { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  
  6. "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }  

$and

指定一个至少包含两个表达式的数组,选择出满足该数组中所有表达式的文档。 $and 操作符使用短路操作,若第一个表达式的值为“ false ”,余下的表达式将不会执行。

语法: { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }

下面将会查找年龄在 20-30 之间的信息,对于下面使用逗号分隔符的表达式列表, MongoDB会提供一个隐式的 $and 操作:


  1. db.user.find({$and:[{age:{$gt:20}},{age:{$lt:30}}]}) 
  2. //上述语句相当于db.user.find({age:{$gt:20},age:{$lt:30}}) 
  3.  
  4. //结果 
  5. { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  
  6. "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } } 

$in

匹配键值等于指定数组中任意值的文档。类似 sql 中 in ,只要匹配一个 value 就会输出

语法: { field: { $in: [<value1>, <value2>, ... <valueN> ] } }

下面将会查找grades中存在22,33之间的任意一个数的信息


  1.  db.user.find({grades:{$in:[22,33]}}) 
  2.   
  3.  //输出 
  4.   
  5. { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  
  6. "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } } 
  7. { "_id" : ObjectId("59058460fe58ed1089f2a5cc"), "name" : "jhon", "age" : 33, "sex" : null, "tags" : [ "python", "java" ],  
  8. "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } } 
  9. { "_id" : ObjectId("59058460fe58ed1089f2a5cd"), "name" : "xiaoming", "age" : 33, "tags" : [ "python", "java" ],  
  10. "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }  

$nin

匹配键不存在或者键值不等于指定数组的任意值的文档。类似 sql 中 not in (SQL中字段不存在使用会有语法错误).

查询出 grades 中不存在100或者44的文档


  1. db.user.find({grades:{$nin:[100,44]}}) 

$not

执行逻辑 NOT 运算,选择出不能匹配表达式的文档 ,包括没有指定键的文档。 $not 操作符不能独立使用,必须跟其他操作一起使用

语法:{ field: { $not: { } } }

查询年龄不大于30的信息


  1. db.user.find({age:{$not:{$gt:30}}}) 
  2.  
  3. //输出 
  4. { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  
  5. "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }  

本文作者:Chenjiabing

来源:51CTO

时间: 2024-09-16 12:27:48

MongoDB干货篇之查询数据的相关文章

MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划_MongoDB

一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为 奇. 1.基础索引 在字段age 上创建索引,1(升序);-1(降序): db.users.ensureIndex({age:1}) _id 是创建表的时候自动创建的索引,此索引是不能够删除的.当

java-【菜鸟提问】用百分比范围查询数据

问题描述 [菜鸟提问]用百分比范围查询数据 在jsp页面中需要写一个按照百分比范围查询表中的数据怎么写? ?BUG占比范围:?--? 我这样写行么? 解决方案 看你数据库表的定义,一般是先groupby,取得count sum,再根据总记录数算出百分比 相关文章 java-菜鸟提问,求大神解答 www-菜鸟提问:怎求 求求求求 需求-一条SQL的写法,菜鸟提问 设计-菜鸟提问:怎样建一个企业人事管理系统 用SQL和C++ remove-[菜鸟提问] Java关于Interator的问题 编程-j

mongodb的java开发查询返回结果后取值的问题

问题描述 mongodb的java开发查询返回结果后取值的问题 用find查询会返回一个document,但是这个document只能获取一级key的数据,如果我想要获得某个子目录的下的数据应该怎么做,好像用get方法取出来的并不谁document类型也就没 办法转型后继续用get方法来取值.比如 {"table":{field:"字段1"}}这个数据格式,在结果的document里可以用get("table")的方式获得"{field

iOS中CoreData数据管理系列三——添加与查询数据

iOS中CoreData数据管理系列三--添加与查询数据 一.引言     在前两篇博客中,分别介绍了iOS中CoreData框架创建数据模型和CoreData框架中的三个核心类.博客地址如下: iOS中CoreData框架简介:http://my.oschina.net/u/2340880/blog/610488. CoreData框架中三个核心的类:http://my.oschina.net/u/2340880/blog/610948. 本篇博客将综合使用三个核心的类,进行数据创建和查询的操

SQL Server调优系列进阶篇(查询语句运行几个指标值监测)

原文:SQL Server调优系列进阶篇(查询语句运行几个指标值监测) 前言 上一篇我们分析了查询优化器的工作方式,其中包括:查询优化器的详细运行步骤.筛选条件分析.索引项优化等信息. 本篇我们分析在我们运行的过程中几个关键指标值的检测. 通过这些指标值来分析语句的运行问题,并且分析其优化方式. 通过本篇我们可以学习到调优中经常利用的几个利器! 废话少说,开始本篇的正题. 技术准备 数据库版本为SQL Server2008R2,利用微软的一个更简洁的案例库(Northwind)进行分析.   利

使用JDBC从数据库中查询数据的方法_Mysql

* ResultSet 结果集:封装了使用JDBC 进行查询的结果 * 1. 调用Statement 对象的 executeQuery(sql) 方法可以得到结果集 * 2. ResultSet 返回的实际上就是一张数据表,有一个指针指向数据表的第一行的前面, * 可以调用next()方法检测下一行是否有效,若有效,返回true,且指针下移, * 相当于iterator 对象的 hasNext() 和 next()方法的结合体 * 3. 当指针定位到一行时,可以通过调用getXxx(index)

ios-IOS的SQLite查询数据,如果没有对应数据的话,应该怎么获取到这个信息

问题描述 IOS的SQLite查询数据,如果没有对应数据的话,应该怎么获取到这个信息 RT,求解. 我是用本地的数据库,数据都是已经固定了的,根据编号显示数据,如果数据中没有编号,我想设置弹出一个提示,但是我不知道怎么获取查不到数据的这个信息 解决方案 select count(*) from table where 条件 返回0表示没有数据

关于mongodb按照字段模糊查询方法

关于mongodb按照字段模糊查询方法   模糊查询:tname包含某个关键字测试' cd /opt/soft/mongodb/bin ./mongo --host 192.168.0.1  --port 17017  test db.test_info.find({"tname": {$regex: '测试', $options:'i'}})  db.test_info.find({"tname": {$regex:/测试.*/i}}) 

JAVA中对存储过程的调用方法(五) 查询数据的存储过程(模糊查询)

五.查询数据的存储过程(模糊查询) -----------------存储过程--------------------- create procedure FindCusts @cust varchar(10) as select customerid from orders where customerid like '%'+@cust+'%' ---------------执行--------------------------- execute FindCusts 'alfki' ----