MongoDB入门系列(三):查询(SELECT)
MongoDB入门系列(三):查询(SELECT)
2018-02-09 10:19 by pursuer.chen, … 阅读, … 评论, 收藏, 编辑
一、概述
mongodb是最接近关系型数据库的NOSQL数据库,它的存储方式非常的灵活;以至于你会将它看成是一个经过冗余过的关系型数据库的表,这也是Mongodb原子性的一个特征。由于没有关系型数据库的表之间的关联关系和事务性所以Mongodb插入和更新的效率非常的高,同时也支持索引。我们在查询的时候不能带着关系型数据库的思维,可以简单的把集合看成是关系型数据库的表、文档看成是行、键看成是字段;但是Mongodb的键可以是数组也可以是文档这又像是支持xml类型的关系型数据库的字段。
版本:3.4.10
插入测试数据
db.test.insert( [ {name:"short sleeve", type:10, size:["S","M","L"], buyer:{ name:"chen", city:"guangzhou" }, saleDetial:[{dates:ISODate("2012-11-02"),price:100,sales:10}, {dates:ISODate("2012-11-03"),price:110,sales:5}, {dates:ISODate("2012-11-04"),price:90,sales:15} ] }, {name:"coat", type:11, size:["M","L"], buyer:{name:"zhang", city:"shanghai"}, saleDetial:[{dates:ISODate("2012-11-02"),price:500,sales:20}, {dates:ISODate("2012-11-03"),price:600,sales:15}, {dates:ISODate("2012-11-04"),price:400,sales:30} ] }, {name:"fleece", type:12, size:["S","M","L"], buyer:{name:"wang", city:"shenzhen"}, saleDetial:[{dates:ISODate("2012-11-02"),price:350,sales:30}, {dates:ISODate("2012-11-03"),price:400,sales:15}, {dates:ISODate("2012-11-04"),price:500,sales:10} ] } ] )
二、简单查询
1.简单键
只查询name,type列;相当于select name,type from test
db.test.find( {}, {"_id":0,"name":1,"type":1} )
查询名称等于“coat”的数据
db.test.find( {name:"coat"}, {"_id":0,"name":1,"type":1} )
2.文档嵌套数组
注意:数组的下标从0开始
1.查询size数组的第一个元素等于M的记录
db.test.find( {"size.0":"M"} )
2.查询size数组保护M的记录
db.test.find( {"size":"M"} )
3.文档嵌套文档
查询键buyer内嵌文档键name等于“chen”的文档
db.test.find( {"buyer.name":"chen"}---列出文档内的元素的方法 ) 或者 db.test.find( {"buyer":{"name":"chen", "city":"guangzhou"}} )
注意:如果使用完整的文档嵌套文档的查询方法,那么内嵌文档中的所有键值都要列出来匹配
4.文档嵌套数组嵌套文档
1.查询数组中的文档键等于
db.test.find( {"saleDetial.price":"400"} )
2.查询数组中第二个元素的文档键等于
db.test.find( {"saleDetial.1.price":"400"}, {"_id":0,"name":1,"type":1,"saleDetial.price":1} )
三、运算符
1.比较运算符
MongoDB 与 RDBMS语句比较
1.查询数组第一个元素的price大于400的文档
db.test.find( {"saleDetial.0.price":{$gt:400}}, {"_id":0,"name":1,"type":1,"size":1,"saleDetial":1} )
2.$or运算符
查询price大于500或者price小于100的文档
db.test.find( {$or:[{"saleDetial.price":{$gt:500}},{"saleDetial.price":{$lt:100}}]}, {"_id":0,"name":1} )
注意:$or运算符之后是用中括号,里面的两个条件分别用大括号
3.$and运算符
1.查询价格大于100并且size等于S的文档名:select name from test where price>100 and size=’S’
db.test.find( {$and:[{"saleDetial.price":{$gt:100}},{"size":"S"}]}, {"_id":0,"name":1} ) 等价于 db.test.find( {"saleDetial.price":{$gt:100},"size":"S"}, {"_id":0,"name":1} )
对应$and默认可以省略。
注意:如果是同一个字段的and条件必须这样写
db.test.find({"saleDetial.price":{$gt:300,$lt:500}})
下面这种写法是错误的,这张写法会认为是多个键值的的查询条件,最终的结果就是price>300 or price <500
db.test.find({"saleDetial.price":{$gt:300},"saleDetial.price":{$lt:500}})
4.$in运算符
相当于关系型数据库的IN
查询price大于100且buyer.name是zhang,chen的文档
db.test.find( {$and:[{"saleDetial.price":{$gt:100}},{"buyer.name":{$in:["zhang","chen"]}}]}, {"_id":0,"name":1,"buyer":1} )
4.$nin运算符
$nin是in的否则条件
db.test.find( {$and:[{"saleDetial.price":{$gt:100}},{"buyer.name":{$nin:["zhang","chen"]}}]}, {"_id":0,"name":1,"buyer":1} )
5.$mod:取模匹配运算符
相当于关系型数据库的%运算
查询type%2余数为1的文档
db.test.find( {"type":{$mod:[2,1]}}, {"_id":0,"name":1,"buyer":1,"type":1} )
6.$not否定运算
查询type%2余数不等于1的文档
db.test.find( {"type":{$not:{$mod:[2,1]}}}, {"_id":0,"name":1,"buyer":1,"type":1} )
7.null值判断
//插入测试数据
db.nullvar.insert([{“x”:null},{“x”:1},{“x”:2}])
//查询null值的数据
db.nullvar.find({“x”:null})
在以前2.6之前的版本查询null值非常的麻烦,代码如下:
db.nullvar.find({“x”:{“$in”:[null],”$exists”:true}})
8.模糊查询
使用正则表达式
//查询name以包含short的文档
db.test.find( {"name":/short/}, {"_id":0,"name":1,"buyer":1,"type":1} )
//查询name以short开头的文档
db.test.find( {"name":/^short/}, {"_id":0,"name":1,"buyer":1,"type":1} )
//?查询
db.test.find( {"name":/^coa?t/}, {"_id":0,"name":1,"buyer":1,"type":1} )
9.日期时间查询
四、扩展操作
1.sort、skip、limit
db.test.find( {$or:[{"saleDetial.price":{$gt:400}},{"type":{$mod:[2,0]}}]}, {"_id":0,"name":1,"buyer":1,"type":1} ) .sort({"type":-1}) .skip(1) .limit(10)
相当于关系型数据库的写法:
select name,buyer,type from test where price>400 or type%2=0 order by type desc limit 1,10
参考:http://www.runoob.com/mongodb/mongodb-query.html