0x00前言
经常使用MongoDB,这里整理一下查询语法,第一部分为SQL和MongoDB用法对照,第二部分为Mongo部分高级用法。PS:仅仅记录自己常用的,更高级的还是查看官方文档吧!
0x01 SQL vs MongoDB语法对应表
MongoDB号称最像SQL的非关系数据库,以下就是两者查询语句对应表
1.插入语句:1
2INSERT INTO users (user_id,age,status) VALUES ("bcd001",45,"A"
db users insert({user_id:"bcd001",age:45,status:"A"})
2.查询语句
2.1 查询所有1
2SELECT * FROM users
db.users.find()
2.2 返回特定字段1
2SELECT id,user_id,status FROM users
db.users.find({},{user_id:1,status:1})
2.3 返回特定字段,且Mongodb不返回”_id”(“_id”默认都是返回的)1
2SELECT user_id,status FROM users
db.users.find({},{user_id:1,status:1,_id:0})
2.4 查询status=”A”1
2SELECT * FROM users WHERE status ="A"
db.users.find({status:"A"})
2.5 查询status=”A”,限定返回字段user_id,status1
2SELECT user_id,status FROM users WHERE status ="A"
db.users.find({status:"A"},{user_id:1,status:1,_id:0})
2.6 查询status不等于A”1
2SELECT * FROM users WHERE status !="A"
db.users.find({status:{$ne:"A"}})
2.7 查询status=”A”且age=501
2SELECT * FROM users WHERE status ="A" AND age = 50
db.users.find({status:"A",age:50})
2.8 查询status=”A”或者age=501
2SELECT * FROM users WHERE status ="A" OR age=50
db.users.find({$or:[{status:"A"},{age:50}]})
2.9 查询age大于251
2SELECT * FROM users WHERE age >25
db.users.find({age:{$gt:25}})
2.10 查询age小于251
2SELECT * FROM users WHERE age<25
db.users.find({age:{$lt:25}})
2.11 查询age大于25且小于501
2SELECT * FROM users WHERE age >25 AND age<=50
db.users.find({age:{$gt:25,$lte:50}})
2.12 查询包含字符串”bc”(模糊匹配)1
2SELECT * FROM users WHERE user_id like "%bc%"
db.users.find({user_id:/bc/})
2.13 查询以”bc”字符串开头1
2SELECT * FROM users WHERE user_id like "bc%"
db.users.find({user_id:/^bc/})
2.14 查询status=”A”,并且按照user_id正序排序1
2SELECT * FROM users WHERE status="A" ORDER BY user_id ASC
db.users.find({status:"A"}).sort({user_id:1})
2.15 查询status=”A”,并且按照user_id逆序排序1
2SELECT * FROM users WHERE status="A"ORDER BY user_id DESC
db.users.find({status:"A"}).sort({user_id:-1})
2.16 计总数1
2
3
4SELECT COUNT(*) FROM users
db.users.count()
or
db.users.find().count()
2.17 查询存在user_id的数据总数1
2
3
4SELECT COUNT(user_id) FROM users
db.users.count({user_id:{$exists:true}})
or
db.users.find({user_id:{$exists:true}}).count()
2.18 查询age大于30的总数1
2
3
4SELECT COUNT(*) FROM users WHERE age>30
db.users.count({age:{$gt:30}})
or
db.users.find({age:{$gt:30}}).count()
2.19 查询status字段的所有不同值(常用于得到某字段的取值范围)1
2SELECT DISTINCT(status) FROM users
db.users.distinct("status")
2.20 查询第一条数据1
2
3
4SELECT* FROM users LIMIT1
db.users.findOne()
or
db.users.find().limit(1)
2.21 查询地10-15条数据1
2SELECT * FROM users LIMIT 5 SKIP 10
db.users.find().limit(5).skip(10)
2.22 显示查询相关的详细信息1
2EXPLAIN SELECT * FROM users WHERE status ="A"
db.users.find({status:"A"}).explain()
3 更新语句
3.1 更新age>25的数据设置status=”c”(注意:MongoDB中如果不指定multi:true则只更新满足要求的第一条数据)1
2UPDATE users SET status="C" WHERE age>25
db.users.update({age:{$gt:25}},{$set:{status:"C"}},{multi:true})
3.2 更新status=”A”的数据设置每个age加31
2UPDATE users SET age=age+3 WHERE status="A"
db.users.update({status:"A"},{$inc:{age:3}},{mult:true})
4 删除语句
4.1 删除status=”D”的数据1
2DELETE FROM users WHERE status="D"
db.users.remove({status:"D"})
4.2 删除user表1
2DELETE FROM users
db.users.remove({})
0x02 MongoDB特殊语法
1 重命名字段名
(注:MongoDB更新字段名需要将所有数据重新写一遍,大数据下会耗费大量时间,笔者曾重写10亿级数据花了1周时间)1
2#重命名user_id为username
db.rdns.update({}, {"$rename":{"user_id" : "user_name"}},false, true)
2 删除特定字段1
2#删除age字段
db.getCollection('tags').update({},{"$unset":{"age":""}},{multi:true})
3 获取特定条件的某字段的去重结果值1
2#获取age大于10的status的去重结果
db.users.distinct("status",{"age":{"$gt":10}})
4 建立索引1
2#username字段建立索引
db.user.ensureIndex({"username":1})
5 建立稀疏索引
稀疏索引与普通索引的区别在于,不存在该字段的情况下,稀疏索引列表不包含该文档(document),而普通索引列表会包含,值为null1
2#建立work.address的稀疏索引
db.user.ensureIndex({"work.address":1},{"sparse":1})
6 查询不存在某字段的数据1
2#查询不存在work字段的数据
db.user.find({"work":{"$exists":0}})
7 查询嵌套字段数据1
2
3
4
5
6
7{"_id" : ObjectId("57125d024a543fd09e73d411"),
"work":{
"address":"北京"
}
}
db.user.find({"work.address":"北京"})
8 查询数据组(直接查询即可)1
2
3
4
5
6
7
8
9
10{"_id" : ObjectId("57125d024a543fd09e73d411"),
"protocols" : [
"https",
"http",
"ftp",
"smtp"
]
}
db.user.find({"protocols":"http"})
9 查询_id1
2#_id大于"57125d024a543fd09e73d411"
db.user.find({"_id":{"$gt":ObjectId("57125d024a543fd09e73d411"}})
10 忽略大小写查询字符串1
db.user.find({"username":/wangWei/i})
11 正则表达式查询1
db.user.find({"username":{"$regex":/^ABC/i}})