首页 文章资讯内容详情

Nosql之Mongodb 2 高级查询

2026-05-31 4 花语

本文内容纲要:

-高级查询 -find() -限制结果集 -findOne() -limit() -条件操作符<,<=,>,>=,!= -$exists -null值的处理 -$mod -$in&$nin -$not -$or -数组操作 -count() -sort() -distinct() -skip() -查询内嵌文档 -使用正则表达式 -$where

接上文

http://www.cnblogs.com/zhaoyang/archive/2012/01/09/2317505.html

接上文…………

高级查询

find()

1查询所有记录

db.users.find()

2查询name为apple的记录

db.users.find({“name”:”apple”})

3查询country为china,gender为1的记录

db.users.find({“country”:”china”,”gender”:1})

限制结果集

对应到标准sql,之前是select*from,现在需要的是selectnamefrom…

1查询name为apple,并且结果只显示name

db.users.find({“name”:”apple”},{“name”:true})

---------------------------------------------------------------------------------------------------------------------------

注:后面这个参数{name:true}代表只显示name,如果有一个设置true,那么其他未设置的都是默认false,但是_id字段是默认true的,如果不想显示_id,可以这么写:

db.users.find({“name”:”apple”},{“name”:true,”_id”:false})

---------------------------------------------------------------------------------------------------------------------------

2查询所有记录,并且结果只显示name和country

db.users.find(null,{“name”:true,“country”:true,“_id”:false})

findOne()

顾名思义,只显示查询到的第一条记录,类似于selecttop1…

db.users.findOne({“gender”:0})

limit()

类似于sqlserver中的top

db.users.find({“gender”:0}).limit(2);

条件操作符<,<=,>,>=,!=

$lt小于(lessthan)

$lte小于等于(lessthanequals)

$gt大于(greaterthan)

$gte大于等于(greaterthanequals)

$ne不等于(notequals)

查出age大于30的记录

db.users.find({“age”:{$gt:30}})

查出age>=30且<=40的记录

db.users.find({“age”:{$gt:30,$lt:40}})

$exists

用于判断字段是否存在,比如我们向users集合里面添加一条记录,只有name属性

db.users.insert({name:”testExists”})

现在我们查出不存在age字段的记录

db.users.find({“age”:{$exists:false}})

查出有age字段但没有gender字段的记录

db.users.find({“age”:{$exists:true},”gender”:{$exists:false}})

null值的处理

需要注意的null与exists的区别

null指的是字段为空或者字段不存在

exists指的是字段是否存在

比较下面两条记录

{“name”:null,”age”:44}

{“age”:45}

如果使用null查询db.xxx.find({name:null})则会查出上面两条记录

但是我们只想找出存在name字段并且其为空的记录,可以这么查询

db.xxx.find({“name”:{$exists:true,$in:[null]}});

$mod

取模,比如我们查询年龄取模10等于1的记录,应该是年龄为1,11,21,…

db.users.find({“age”:{$mod:[10,1]}})

$in&$nin

这个类似于标准sql的in与notin

查询age为23或者24的记录

db.users.find({“age”:{$in:[23,24]}})

查询age不为23或者24的记录

db.users.find({“age”:{$nin:[23,24]}})

$not

可以用在任何其他条件之上

db.users.find({$not:{“age”:{$gt:25}}})

$or

查询年龄为32或者name为zhangsan的记录

db.users.find({$or:[{“name”:”zhangsan”},{“age”:32}]})

数组操作

假设我们有下面两个document

${“name”:”zhangsan”,”booksNumber”:[101,102,103]}

${“name”:”lisi”,“booksNumber”:[101,103]}

$all

db.users.find({“booksNumber”:{$all:[101,102]}});

那么就能查出第一条记录,它需要满足里面所有的条件

$size

我们需要查询只有booksNumber里面只有两个的记录

db.users.find({“booksNumber”:{$size:2}})

count()

查询总记录数

db.users.find().count()

注:如果我们使用了limit

db.users.find().limit(3).count()这里是取前三条记录,但是调用count()后还是显示总记录数,如果我们需要返回被限制后的记录数

db.users.find().limit(3).count(true)即可

sort()

这也是个顾名思义的操作,排序:1代表升序-1代表降序

按名字进行升序排序

db.users.find().sort({name:1})

先按名字升序,再按年龄降序

db.users.find().sort({name:1,age:-1})

distinct()

查询年龄小于等于50所有的name并去除重复

db.users.distinct(“name”,{“age”:{$lte:50}})

skip()

这一特性通常用于分页

跳过三条记录并取之后的三条记录

db.users.find().skip(3).limit(3)

查询内嵌文档

比如要查询这么一条记录:

{“books”:{“bookid”:100,“bookname”:”english”}}

db.users.find({“books.bookid”:100});

使用正则表达式

使用正则表达式也是mongodb非常强大的特性

比如我们使用正则表达式对name进行过滤

db.users.find({“name”:/^[fc]{1}/})

$where

可以使用javascript代码进行查询,这使得查询几乎能做任何事情

db.users.find({$where:function(){

//this指遍历到的当前的document

//根据returntrueorfalse来判断此document是否满足find的条件

if(this.name==“zhangsan”){

returntrue;

}

for(varpropinthis){

if(this[prop]==“123”){

returntrue;

}

}

returnfalse;

}});

下一篇将介绍游标以及存储过程

本文内容总结:高级查询,find(),限制结果集,findOne(),limit(),条件操作符<,<=,>,>=,!=,$exists,null值的处理,$mod,$in&$nin,$not,$or,数组操作,count(),sort(),distinct(),skip(),查询内嵌文档,使用正则表达式,$where,

原文链接:https://www.cnblogs.com/zhaoyang/archive/2012/01/10/2317664.html