mongodb学习记录之一:基础查询

来源:互联网 发布:霍建华林心如 知乎扒皮 编辑:程序博客网 时间:2024/06/05 20:44

最近在学习mongodb,在学习的过程中,记录一下博客,以备以后查看。

今天先记录一下find查询。

在学习之前先往数据库中插入一定量的数据,这里我使用循环,插入了4096条数据,格式如下:

{"name":"李明","sex":"男","score":{"math":87,"english":65,"chinese":78}}


基础查询:

指定查询条件

空的查询条件会匹配全部的文档,例如:

>db.students.find()

会将所有的文档都查询出来。

如果我们想按照条件进行查询,指定键值对即可。整数匹配整数,布尔类型匹配布尔类型。

例如,我们要查询所有女生的信息,则:

>db.students.find({"sex":"女"})

指定返回的键

以上的查询,将返回文档中所有的键,有时候我们并不需要返回所有的键,只需要其中的某些键,我们可以指定返回的键来进行过滤:
>db.students.find({"sex":"女"},{"_id":0,"name":1,"sex":1})

这样我们就指定了返回的键中只含name和sex,_id就不显示了。
注意:_id这个键,如果不指定总是会显示,如果不想返回_id,则要显式的指定_id为0,其他键不指定则不显示


条件查询

查询条件

查询不仅能像前面那样的精确匹配,还能条件匹配。
比如范围,OR,取反等条件。

条件符说明$lt<$gt>$lte<=$gte>=例子:
1、查询数学成绩大于90的所有女同学
>db.students.find({"score.math":{"$gt":85},"sex":"女"});
2、查询英语成绩在90-94的男同学
>db.students.find({"score.english":{"$gt":90,"$lt":94},"sex":"男"})

OR查询

mongoDB中有两种OR查询:$in和$or

$in用于一个键的不同值

$or用于不同键的组合

例子:
1、查询数学成绩是90或者95的女生
>db.students.find({"score.math":{"$in":[90,95]},"sex":"女"})
2、查询数学成绩或语文成绩满分的同学
>db.students.find({"$or":[{"score.math":100},{"score.english":100},{"score.chinese":100}]})

$not

$not是元条件句,即可用在任何其他条件之上。

1、查询语文成绩不大于55的学生
>db.students.find({"score.chinese":{"$not":{"$gt":55}}})

其实$not的更强大之处是配合正则。正则以后会慢慢学习。

特定类型的查询

null查询

null很奇怪,不仅仅会匹配本身,还能匹配“不存在”的,即可以匹配一个键值为null的文档,也可以匹配不存在这个键的文档
例如,下面一个例子:
mongo中文档结构如下:
{ "_id" : 2 }{ "_id" : 3 }{ "_id" : 6, "name" : 12 }{ "_id" : 7, "name" : 14 }{ "_id" : 8, "name" : 16 }{ "_id" : 9, "name" : 18 }{ "_id" : 0, "name" : "SaRan" }{ "_id" : 1, "name" : "SaRan" }{ "_id" : 5, "book" : "war", "name" : 10 }{ "_id" : 4, "clazz" : null, "name" : "coolcao" }{ "_id" : 11, "name" : "good", "clazz" : "class4" }

想要查询clazz为null的记录,即_id为4的文档,
>db.person.find({"clazz":null})

查询出来结果如下,由此看来,null会匹配本身是空值的文档,还能匹配不存在该键的文档
{ "_id" : 2 }{ "_id" : 3 }{ "_id" : 6, "name" : 12 }{ "_id" : 7, "name" : 14 }{ "_id" : 8, "name" : 16 }{ "_id" : 9, "name" : 18 }{ "_id" : 0, "name" : "SaRan" }{ "_id" : 1, "name" : "SaRan" }{ "_id" : 5, "book" : "war", "name" : 10 }{ "_id" : 4, "clazz" : null, "name" : "coolcao" }

如果就想只查询出clazz为null的文档,不存在clazz键的不列出来咋办?使用$exists

>db.person.find({"clazz":{"$in":[null],"$exists":true}})
因为mongo中没有等于($eq),所以只能使用$in来达到同样的效果了

正则表达式

正则表达式可以灵活的匹配字符串,mongo的find可以支持正则表达式来查询

查询所有姓“张”的同学

>db.students.find({"name":{"$regex":"张.+"}})或>db.students.find({"name":/张.+/})

这两种形式是等价的,只不过是用了两种不同的表达方式而已。

在第一种方式中,更灵活,可以添加可选的参数$options

例如,查询的姓名中不区分大小写,则可以如下面:

>db.students.find({"name":{"$regex":"tom","$options":"i"}})
既可以查询到tom,也可以查询到Tom,tOm,TOM等等


$options的可选值:

  • i 忽略大小写
  • m 多行查找。如果内容里面不存在换行符号(例如\n)或者构造上没有(start/end),则该选项没有任何效果
  • x 空白字符除了被转义的字符类中的以外完全被忽略,在未转义的字符类之外的#以及下一个换行符之间的所有字符,包括两个头,也都被忽略。
  • s 圆点元字符(.)匹配所有字符,包括换行符

查询数组

数组大多数情况下可以这么理解:每一个元素都是整个键的值

例如,有一个水果的集合,结构如下:


{ "_id" : 1, "fruit" : [  "apple",  "pear",  "banana" ] }{ "_id" : 3, "fruit" : [  "pear",  "cheey",  "banana" ] }{ "_id" : 2, "fruit" : [  "apple",  "orange",  "banana",  "pear",  "cheey" ] }
看下面的查询:
>db.food.find({"fruit":"apple"})

匹配的结果:

{ "_id" : 1, "fruit" : [  "apple",  "pear",  "banana" ] }{ "_id" : 2, "fruit" : [  "apple",  "orange",  "banana",  "pear",  "cheey" ] }

如果我们要通过多个元素匹配,那么应该用$all

$all

例如,我们要查找含有apple和orange的文档:
>db.food.find({"fruit":{"$all":["apple","orange"]}})

如果要精确匹配,就要使用整个数组了
>db.food.find({"fruit":["apple","banana"]})

上面的语句能“精确”匹配:
{ "_id" : ObjectId("532c409e38c77537a4a525bc"), "fruit" : [  "apple",  "banana" ] }

$size

$size可以查询指定长度的数组
>db.food.find({"fruit":{"$size":3}})

上面的例子是查询food中fruit有3个值的文档

$size并不能与其他查询子句组合(比如$gt),但是这种查询可以通过在文档中添加"size"键的方式来实现,这样每一次指定数组添加元素的时候,同时增加"size"的值。原来这样的更新:

>db.food.update({"$push":{"fruit":"strawberry"}})
就会变成下面这样:
>db.food.update({"$push":{"fruit":"strawberry"},"$inc":{"size":1}})

增加的操作非常快,对性能的影响微乎其微。这样后,就可以像下面这样查询了:
>db.food.find({"size":{"$gt":3}})





0 0
原创粉丝点击