Quantcast
Channel: CodeSection,代码区,数据库(综合) - CodeSec
Viewing all articles
Browse latest Browse all 6262

MongoDB学习笔记五―查询

$
0
0
数据准备
{ "goods_id" : 1, "goods_name" : "KD876", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : "4", "goods_name" : "诺基亚N85原装充电器", "createTime" : ISODate("2016-09-11T00:00:00Z") }
{ "goods_id" : 3, "goods_name" : "诺基亚原装5800耳机", "createTime" : ISODate("2016-10-09T00:00:00Z") }
{ "goods_id" : 5, "goods_name" : "索爱原装M2卡读卡器", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 6, "goods_name" : "胜创KINGMAX内存卡", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 7, "goods_name" : "诺基亚N85", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 8, "goods_name" : "飞利浦9@9v", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 9, "goods_name" : "诺基亚E66", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : "10", "goods_name" : "索爱C702c", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 11, "goods_name" : "索爱C702c", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 12, "goods_name" : "摩托罗拉A810", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 13, "goods_name" : "诺基亚5320", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 14, "goods_name" : "诺基亚5800XM", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : "15", "goods_name" : "摩托罗拉A810", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 16, "goods_name" : "恒基伟业G101", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 17, "goods_name" : "夏新N7", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 18, "goods_name" : "夏新T5", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 19, "goods_name" : "三星SGH-F258", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 20, "goods_name" : "三星BC01", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 2, "createTime" : ISODate("2015-10-01T00:00:00Z") }
find

find 的第一个参数决定了要返回哪些文档,用于指定查询条件。 要不指定查询文档,默认就是 {}, 指定多个键 / 值对,相当于 sql 的 and。第二个参数来指定想要的键(默认情况下,"_id"总是显示)。

查询条件 And查询

使用 AND 型查询时,应尽可能用最少的条件来限定结果的范围。


> db.product.find({"goods_id":"4","goods_name":"诺基亚N85原装充电器"},{"_id":0})
{ "goods_id" : "4", "goods_name" : "诺基亚N85原装充电器", "createTime" : ISODate("2016-09-11T00:00:00Z") }

当然也可以这样(纯属闲得蛋疼):


> db.product.find({"$and":[{"goods_id":"4","goods_name":"诺基亚N85原装充电器"}]},{"_id":0})
{ "goods_id" : "4", "goods_name" : "诺基亚N85原装充电器", "createTime" : ISODate("2016-09-11T00:00:00Z") }
Or 查询

方式一: $in 、 $nin

$in 可以用来查询一个键的多个值 , 可以指定不同类型的条件和值。

$nin 将返回与数组中所有条件都不匹配的文档。

$in 是对单个键做 OR 查询。


> db.product.find({"goods_id":{"$in":["4",5,6]}},{"_id":0})
{ "goods_id" : "4", "goods_name" : "诺基亚N85原装充电器", "createTime" : ISODate("2016-09-11T00:00:00Z") }
{ "goods_id" : 5, "goods_name" : "索爱原装M2卡读卡器", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 6, "goods_name" : "胜创KINGMAX内存卡", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
>

方式二: $or

$or 更通用一些,可以在多个键中查询任意的给定值

使用 $or 时,第一个条件条件应尽可能匹配更多的文档,这样才是最为高效的。


> db.product.find({"$or":[{"goods_id":16},{"goods_name":"夏新T5"},{"createTime":{"$lt":new Date("2016-01-01")}}]},{"_id":0})
{ "goods_id" : 16, "goods_name" : "恒基伟业G101", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 18, "goods_name" : "夏新T5", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 2, "createTime" : ISODate("2015-10-01T00:00:00Z") }
$lt、$lte、$gt、$gte、$eq(貌似没什么用)、$ne

$lt 、 $lte 、 $gt 、 $gte 、$eq、 $ne 分别对应sql中的 < 、 <= 、 > 、 >= 、=、 != 。组合查找一个范围的值。


> db.product.find({"goods_id":{"$gte":3,"$lt":5}},{"_id":0} )
{ "goods_id" : 3, "goods_name" : "诺基亚原装5800耳机", "createTime" : ISODate("2016-10-09T00:00:00Z") }
> start=new Date("01/01/2016")
ISODate("2015-12-31T16:00:00Z")
> db.product.find({"createTime":{"$lt":start}})//查询指定日期之前的数据
{ "_id" : ObjectId("585a65d9a847c6d3a3ee1da5"), "goods_id" : 2, "createTime" : ISODate("2015-10-01T00:00:00Z") }
限制

查询使用上有些限制。传递给数据库的查询文档的值必须是常量。也就是说不能引用文档中其他键的值。


db.product.find({"goods_id":this.goods_name}).pretty()
$mod

取模运算符,会将查询的值除以第一个给定值,若余数等于第二个给定的值则匹配成功。


> db.product.find({"goods_id":{"$mod":[5,1]}},{"_id":0})
{ "goods_id" : 1, "goods_name" : "KD876", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 6, "goods_name" : "胜创KINGMAX内存卡", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 11, "goods_name" : "索爱C702c", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 16, "goods_name" : "恒基伟业G101", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
>
$not

$not 是元条件句,即可以用在其他任何其他条件之上。查询和匹配的件相反的数据。

$not 与正则表达式联合使用时极为有用,用来查找那些与特定模式不匹配的文档。


> db.product.find({"goods_id":{"$not":{"$mod":[5,1]}}},{"_id":0})
{ "goods_id" : "4", "goods_name" : "诺基亚N85原装充电器", "createTime" : ISODate("2016-09-11T00:00:00Z") }
{ "goods_id" : 3, "goods_name" : "诺基亚原装5800耳机", "createTime" : ISODate("2016-10-09T00:00:00Z") }
{ "goods_id" : 5, "goods_name" : "索爱原装M2卡读卡器", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 7, "goods_name" : "诺基亚N85", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 8, "goods_name" : "飞利浦9@9v", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 9, "goods_name" : "诺基亚E66", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : "10", "goods_name" : "索爱C702c", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 12, "goods_name" : "摩托罗拉A810", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 13, "goods_name" : "诺基亚5320", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 14, "goods_name" : "诺基亚5800XM", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : "15", "goods_name" : "摩托罗拉A810", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 17, "goods_name" : "夏新N7", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 18, "goods_name" : "夏新T5", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 19, "goods_name" : "三星SGH-F258", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 20, "goods_name" : "三星BC01", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 2, "createTime" : ISODate("2015-10-01T00:00:00Z") }
条件语义

在查询中, $lt 在内层文档,而在更新中 $inc 则是外层文档的键。

基本可以肯定:条件语句是内层文档的键,而修改器则是外层文档的键。

一个键可以有任意多个条件,但是一个键不能对应多个更新修改器。

有一些”元操作符” 也位于外层文档中,比如 $and 、 $or 、 $nor

查询优化器不会 $and 进行优化,这与其他操作符不相同。

Viewing all articles
Browse latest Browse all 6262

Trending Articles