版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
与SQL查询对比
作用 | SQL | MongoDB |
---|---|---|
所有记录 | SELECT * FROM users | db.users.find() |
age=18的记录 | SELECT * FROM users WHERE age=33 | db.users.find({age:18}) |
子键(字段)筛选 | SELECT a, b FROM users WHERE age=18 | db.users.find({age:18}, {a:1,b:1}) |
排序 | SELECT * FROM users WHERE age=18 ORDER BY name | db.users.find({age:18}).sort({name:1}) |
比大小 | SELECT * FROM users WHERE age>18 | db.users.find({‘age’:{$gt:18}})}) |
正则(模糊匹配) | SELECT * FROM users WHERE name LIKE “Joe%” | db.users.find({name:/^Joe/}) |
忽略、限制 | SELECT * FROM users LIMIT 10 20 | db.users.find().limit(10).skip(20) |
Or操作 | SELECT * FROM users WHERE a=1 or b=2 | db.users.find( { $or : [ { a : 1 } , { b : 2 } ] } ) |
仅返回1条(TOP 1) | SELECT * FROM users LIMIT 1 | db.users.findOne() |
Distinct聚合 | SELECT DISTINCT last_name FROM users | db.users.distinct(‘last_name’) |
Count聚合 | SELECT COUNT(AGE) from users | db.users.find({age: {’$exists’: true}}).count() |
查询计划 | EXPLAIN SELECT * FROM users WHERE z=3 | db.users.find({z:3}).explain() |
子健筛选
- 包含所有子健
db.users.find({age:18})
- 仅包含子健:_id age gender
db.users.find({age:18}, {age:1, gender:1})
- 仅包含子健:_id age
db.users.find({age:18}, {age:1, gender:0})
- 剔除 _id (除_id以外所有的值)
db.users.find({age:18}, {_id:0})
复杂查询
mongdb 支持比较查询 (大于小于, or, not等)
- 返回年龄大于等于18岁小于25岁的username
db.users.find({ age: {'$gte': 18, '$lt': 25}});
- 返回大于18岁,且不等于25岁的username
db.users.find({age: {'$gt': 18, '$ne': 25}});
- 返回等于18岁 或者等于25岁的username
db.users.find({'$or':[ {'age': 28},{'age': 25} ]});
查询条件操作符
id | 操作符 | 解释 | 示例 |
---|---|---|---|
1 | $lt, gt, $gte | <, <=, >, >= | db.things.find({“a”:{$gt: value}}); |
2 | $all | 数组中的元素是否完全匹配 | db.things.find({a: {$all: [2, 3]}}); |
3 | $exists | 可选:true,false | db.things.find({a: {$exists: true}}); |
4 | $mod | 取模:a % 10 == 1 | db.things.find({a: {$mod: [10, 1]}}); |
5 | $ne | 取反:即not equals | db.things.find( { x : { $ne : 3 } } ); |
6 | $in | 类似于SQL的IN操作 | db.things.find({j:{$in: [2,4,6]}}); |
7 | $nin | $in的反操作,即SQL的 NOT IN | db.things.find({j:{$nin: [2,4,6]}}); |
8 | $nor | $or的反操作,即不匹配(a或b) | db.things.find({name: “bob” , $nor: [{a: 1}, {b: 2}]}) |
9 | $or | Or子句,注意$or不能嵌套使用 | db.things.find({name: “bob”, $or:[{a: 1 }, {b: 2}]}) |
10 | $size | 匹配数组长度 | db.things.find({a: {$size: 1}}); |
11 | $type | 匹配子键的数据类型,详情请看 | db.things.find({a : {$type: 2}}); |
正则表达式
正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串.
MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式 或者类似于 /^.+/这样的正则表达式
实例数据 fsp_yjh
{
"_id" : "60b17a85b98a35539601d5de0d76eae9",
"department" : "中国银行业监督管理委员会",
"gtime" : 1558345756, # 获取日期
"ctime": 1548345756, # 发布日期
"stime" : "201905201749",
"branch" : "乌兰察布银保监分局",
"punish_obj": ["张某", "李某"], # 处罚对象
"branch_tree" : {
"level_0" : "中国银行业监督管理委员会",
"level_1" : "内蒙古监管局",
"level_2" : "乌兰察布银保监分局"
},
"group_key" : "内蒙古监管局"
}
实例数据 book
{
"_id" : "f6708ecc739136018c7f63daf86b961d",
"book_name" : "Python学习手册(原书第5版)",
"introduction": "Python入门必读之作,位列美亚软件编程畅销榜首,《Python编程》姊妹篇 覆盖Python 3.3和Python2.7两个版本,详细讲解各种语言特性,并新增大量示例",
"gtime" : 1558345756, # 获取日期
"ctime": 1548345756, # 发布日期
"price" : "145",
"author" : "[美]马克·卢茨",
}
- 正则表达式 查询 branch 中包含有
银保监分局
的所有文档
db.fsp_yjh.find({"branch": {$regex:"银保监分局"}})
- 不区分大小写的正则表达式 设置参数 $options 为 $i
db.book.find({"book_name": {$regex:"python",$options:"$i"}})
- 也可以使用 / / 上个查询等同于
db.book.find({"book_name": /python/i})
子项查询
- 返回 fsp_yjh 中punish_obj 为第2项为’李某’的所有文档
db.fsp_yjh.find({"punish_obj.1": "李某"})
- 返回 fsp_yjh 中branch_tree 的level_2 为 ‘乌兰察布银保监分局’ 的所有文档
db.fsp_yjh.find({"branch_tree.level_2": "乌兰察布银保监分局"})
排序分页
- limit: 限制返回结果的项目数量的上限; 可以理解为每页最多N项
- skip: 在返回时略过的项目数量的上限; 可以变通的实现翻页
- sort: 指定排序方式; 可以支持多键
- 例子:department 为’中国银行业监督管理委员会’ 返回10条数据,略过第100项, 按照gtime降序, ctime增序
db.fsp_yjh.find({"department" : "中国银行业监督管理委员会"}).limit(10).skip(100).sort({"gtime": -1, "ctime": 1})