MongoDB查询

MongoDB不使用SQL,而使用自己的查询语言。这些查询包括_id查询、限定范围、排序、投影等。

查询相关的操作符

选择器

指定查询最简单的一种方式是使用查询器的键值对按照字面匹配要查找的文档。
db.users.find({name: “zhangsan”});
db.users.find({name: “zhangsan”, sex: “man”});

范围运算符

如果需要查询值在一定范围内的文档,MongoDB提供了如下的运算符:
$lt;$gt;$lte;$gte。
分别代表:小于,大于,小于等于,大于等于。
db.users.find({name: {$gt: 20, $lt: 30}});

集合运算符

如果需要查询的值的范围是一个列表,MongoDB提供了如下的运算符:
$in,$all,$nin。
分别代表:参数匹配集合中任意一个元素,参数匹配集合中的所有元素,参数不匹配集合中任何一个元素。
db.paper.find({color: {$in: [“white”, “black”]}});
db.paper.find({color: {$nin: [“white”, “black”]}});
db.paper.find({tag: {$all: [“cheap”, “thin”]}});
由于$nin并非是选择性的,所以无法利用索引。

布尔运算符

MongoDB的布尔运算符包括如下:
$ne:不匹配参数条件,即不匹配文档中的值;最好结合别的运算符一起使用,否则因为无法使用索引而导致效率低下;
$not:不匹配结果,即不匹配MongoDB的运算符或者正则表达式的查询结果;
$or:有一个条件匹配即可;
$and:所有条件都要匹配;
$nor:所有条件都不匹配;
db.company.find({catagory: “IT”, region: {$ne: “Beijing”}});
db.users.find({age: {$not: {$lte: 30}}}); // 与$gt的区别:返回age大于30或者没有age属性的文档
db.company.find({\$or: [{catagory: “IT”}, {region: “Beijing”}]});
db.company.find({\$and: [{catagory: “IT”}, {region: “Beijing”}]});

查询关键字文档操作符

MongoDB集合不强制Schema,所以文档中的key可能存在,也可能不存在,可以使用$exists来判断某个属性是否存在。
$exists:判断元素是否存在。
db.products.find({detail.color: {$exists: true}});
db.products.find({detail.color: {$exists: false}});

匹配子文档

查询关键字使用(.)分割,则是查询子文档。
db.company.find({employee.title.description: “PM”});
除了匹配单一文档,还可以整个子文档匹配,如下(此处属性的顺序很重要):
db.company.find({employee: {title: “PM”, salary: 2000}});
不论子文档是单独的对象,还是数组对象,上面的查询操作都能支持。

数组查询

在进行子文档查询的时候,如果仅一个查询条件则没有什么问题,数组中的各个子文档对象能匹配则匹配即可。
如果有多个查询条件的话,如下:
db.company.find({employee.title: “PM”, employee.salary: 2000});
这种情况下两个条件之间是or的关系,也就是说数组中的子文档匹配到上面两个条件中的一个即认为匹配成功。
如果我们希望二者是and的关系,则需要使用一个新的操作符$elemMatch:
db.company.find({employee: {$elemMatch: {title: “PM”, salary: 2000}}});

如果要通过数组的大小进行查询的话,则使用$size操作符:
db.users.find({address: {$size: 3}}); // 查询有三个地址的用户

JavaScript查询运算符

JavaScript查询运算符是$where。
db.reviews.find({$where: “function() { return this.count > 3; }”});
db.reviews.find({$where: “this.count > 3”});
JavaScrip
t表达式不能使用索引,并且带来大量浪费。因为它必须在JavaScript解释器的上下文中评估并且是单线程的。

正则表达式查询

MongoDB是区分大小写的。
在使用正则表达式时,除非使用/i修饰符,否则搜索将是区分大小写的。
如果使用了/i,那么不区分大小写,此时将不会使用索引。

关于查询的一些附加操作

MongoDB发出查询后,还允许进一步执行结果集合的各种查询选项。

映射

映射key子集:
映射的子集通过find方法的第二个参数指定。
db.users.find({}, {name: 1}); //返回结果包含name和_id两个字段
db.users.find({}, {name: 0, address: 0}); //返回结果不包含name和address两个字段
尽管_id属于一种特殊情况,但是也可以通过设置0将其排除掉。
映射文档子集:
除了包含了排除字段,还可以将返回文档的范围存储到一个数组(典型应用:分页)。
db.products.find({}, {reviews: {$slice: 10}}); // 返回product文档,其reviews子文档仅返回前10个
db.products.find({}, {reviews: {$slice: -5}}); // 返回product文档,其reviews子文档仅返回最后5个
db.products.find({}, {reviews: {$slice: [20, 10]}}); //返回product文档,其reviews子文档跳过前20个,返回接下来的10个
$slice不会阻止其他返回字段,如果想限制字段,必须明确说明:
db.products.find({}, {reviews: {\$slice: 10}, name: 1}); //produce文档仅返回name和reviews的前10个子文档

排序

db.reviews.find({}).sort({rate: -1}); //对查询结果按照rate进行降序排列
db.reviews.find({}).sort({rate: -1, votes: -1}); //复合排序
MongoDB中懂得如何建立索引是提升排序效率的关键

跳过和限制

db.docs.find({}).skip(50).limit(10).sort({date: -1});
skip用于忽略,limit用于限制返回的文档个数。
skip应该慎重使用,因为这种查询服务要求扫描的文档数等于skip值;更好的策略是忽略skip而使用范围查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值