一概述
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.sortskiplimit
- 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
来源: https://www.cnblogs.com/chenmh/p/8426527.html