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. },{
  13. name:'jhon',
  14. age:33,
  15. sex:null,
  16. tags:['python','java'],
  17. grades:[66,22,44,88],
  18. school:{
  19. name:'kuangda',
  20. city:'xuzhou'
  21. }
  22. },
  23. {
  24. name:'xiaoming',
  25. age:33,
  26. tags:['python','java'],
  27. grades:[66,22,44,88],
  28. school:{
  29. name:'kuangda',
  30. city:'xuzhou'
  31. }
  32. }
  33. ]

find( , )

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

实例:

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

 
 
 
  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.         }                                             

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

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

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

查询内嵌文档

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

完全匹配查询

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

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

$ne

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

 
 
 
  1. db.user.find({age:{$ne:22}})
  2. //输出
  3. { "_id" : ObjectId("59057c16f551d8c9003d31e0"), "name" : "jhon", "age" : 33, "tags" : [ "python", "java" ], 
  4. "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. //输出,可以看出这里的grades只输出了前面两个
  3. { "_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. { "_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. { "_id" : ObjectId("59057c16f551d8c9003d31df"), "name" : "jack", "grades" : [ 44, 55 ] } 

$exists

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

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

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

$or

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

语法: { $or: [ { }, { }, ... , { } ] }

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

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

$and

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

语法: { $and: [ { }, { } , ... , { } ] }

下面将会查找年龄在 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. { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ], 
  5. "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }

$in

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

语法: { field: { $in: [, , ... ] } }

下面将会查找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. { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ], 
  4. "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } } 

当前名称:MongoDB干货篇之查询数据
文章源于:http://www.shufengxianlan.com/qtweb/news16/529766.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联