MongoDB干货篇之查询数据

发表于:2017-5-08 11:00

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:刘春    来源:网易科技

  查询内嵌文档
  上述例子中插入的 school 数据就表示内嵌文档
  完全匹配查询
  完全匹配查询表示 school 中的查询数组必须和插入的数组完全一样,顺序都必须一样才能查找出来
db.user.find({name:'jack',school:{name:'shida',city:'xuzhou'}});
//输出结果
{ "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22, "tags" : [ "python", "c++", "c" ],
"grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
//下面是指定输出的字段,这里的school.name表示只输出school文档中name字段,必须加引号
db.user.find({name:'jack',school:{name:'shida',city:'xuzhou'}},{name:1,age:1,'school.name':1});
//输出结果
{ "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22, "school" : { "name" : "shida" } }
  键值对查询
  可以通过键值对查询,不用考虑顺序,比如 'school.name':'shida' ,表示查询学校名字为shida 的数据,这里的引号是必须要的
  db.user.find({'school.name':'shida'},{name:1,school:1});
  //输出结果
  { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "school" : { "name" : "shida", "city" : "xuzhou" } }
  查询操作符
  下面我们将配合查询操作符来执行复杂的查询操作,比如元素查询、 逻辑查询 、比较查询操作。我们使用下面的比较操作符 "$gt" 、 "$gte" 、 "$lt" 、 "$lte" (分别对应 ">" 、 ">=" 、 "<" 、 "<=" )
  实例
  下面查询年龄在 20-30 之间的信息
db.user.find({
age:{$gt:20,$lt:30}
})
//输出
{ "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22, "tags" : [ "python", "c++", "c" ],
"grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
$ne
$ne 表示不相等,例如查询年龄不等于 22 岁的信息
db.user.find({age:{$ne:22}})
//输出
{ "_id" : ObjectId("59057c16f551d8c9003d31e0"), "name" : "jhon", "age" : 33, "tags" : [ "python", "java" ],
"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 中的前两个数
  db.user.find({name:'jack'},{grades:{$slice:2},name:1,age:1,'school.name':1});
  //输出,可以看出这里的grades只输出了前面两个
  { "_id" : ObjectId("59057c16f551d8c9003d31df"), "name" : "jack", "age" : 22, "grades" : [ 22, 33 ], "school" : { "name" : "shida" } }
  下面将输出后3个数据
  db.user.find({name:'jhon'},{grades:{$slice:-3},name:1});
  //输出
  { "_id" : ObjectId("59057c16f551d8c9003d31e0"), "name" : "jhon", "grades" : [ 22, 44, 88 ] }
  下面介绍指定一个数组作为参数。数组参数使用 [ skip , limit ] 格式,其中第一个值表示在数组中跳过的项目数,第二个值表示返回的项目数。
  db.user.find({name:'jack'},{grades:{$slice:[2,2]},name:1});  //这里将会跳过前面的两个,直接得到后面的两个数据
  //输出
  { "_id" : ObjectId("59057c16f551d8c9003d31df"), "name" : "jack", "grades" : [ 44, 55 ] }
  $exists
  如果 $exists 的值为 true ,选择存在该字段的文档,若值为 false 则选择不包含该字段的文档
  下面将会查询不存在sex这一项的信息
  db.user.find({sex:{$exists:false}})
  //结果
  { "_id" : ObjectId("59058460fe58ed1089f2a5cd"), "name" : "xiaoming", "age" : 33, "tags" : [ "python", "java" ],
  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }
  db.user.find({sex:{$exists:true}});
  //结果
  { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],
  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
  { "_id" : ObjectId("59058460fe58ed1089f2a5cc"), "name" : "jhon", "age" : 33, "sex" : null, "tags" : [ "python", "java" ],
  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }
  $or
  执行逻辑 OR 运算,指定一个至少包含两个表达式的数组,选择出至少满足数组中一条表达式的文档。
  语法: { $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
  下面将要查找 age 等于 22 或者 age 等于 33 的值
  db.user.find({$or:[{age:22},{age:33}]})
  //结果
  { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],
  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
  { "_id" : ObjectId("59058460fe58ed1089f2a5cc"), "name" : "jhon", "age" : 33, "sex" : null, "tags" : [ "python", "java" ],
  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }
  { "_id" : ObjectId("59058460fe58ed1089f2a5cd"), "name" : "xiaoming", "age" : 33, "tags" : [ "python", "java" ],
  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }
  下面将会查找出年龄为22或者33并且姓名为 jack 的人的信息
  db.user.find({name:'jack',$or:[{age:33},{age:22}]})
  //结果
  { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],
  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
  $and
  指定一个至少包含两个表达式的数组,选择出满足该数组中所有表达式的文档。 $and 操作符使用短路操作,若第一个表达式的值为“ false ”,余下的表达式将不会执行。
  语法: { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
  下面将会查找年龄在 20-30 之间的信息,对于下面使用逗号分隔符的表达式列表, MongoDB会提供一个隐式的 $and 操作:
  db.user.find({$and:[{age:{$gt:20}},{age:{$lt:30}}]})
  //上述语句相当于db.user.find({age:{$gt:20},age:{$lt:30}})
  //结果
  { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],
  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
  $in
  匹配键值等于指定数组中任意值的文档。类似 sql 中 in ,只要匹配一个 value 就会输出
  语法: { field: { $in: [<value1>, <value2>, ... <valueN> ] } }
  下面将会查找grades中存在22,33之间的任意一个数的信息
  db.user.find({grades:{$in:[22,33]}})
  //输出
  { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],
  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
  { "_id" : ObjectId("59058460fe58ed1089f2a5cc"), "name" : "jhon", "age" : 33, "sex" : null, "tags" : [ "python", "java" ],
  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }
  { "_id" : ObjectId("59058460fe58ed1089f2a5cd"), "name" : "xiaoming", "age" : 33, "tags" : [ "python", "java" ],
  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }
  $nin
  匹配键不存在或者键值不等于指定数组的任意值的文档。类似 sql 中 not in (SQL中字段不存在使用会有语法错误).
  查询出 grades 中不存在100或者44的文档
  db.user.find({grades:{$nin:[100,44]}})
  $not
  执行逻辑 NOT 运算,选择出不能匹配表达式的文档 ,包括没有指定键的文档。 $not 操作符不能独立使用,必须跟其他操作一起使用
  语法:{ field: { $not: { } } }
  查询年龄不大于30的信息
  db.user.find({age:{$not:{$gt:30}}})
  //输出
  { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],
  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号