MongoDB使用语法

0x00前言

  经常使用MongoDB,这里整理一下查询语法,第一部分为SQL和MongoDB用法对照,第二部分为Mongo部分高级用法。PS:仅仅记录自己常用的,更高级的还是查看官方文档吧!

0x01 SQL vs MongoDB语法对应表

MongoDB号称最像SQL的非关系数据库,以下就是两者查询语句对应表
1.插入语句:

1
2
INSERT INTO users (user_id,age,status) VALUES ("bcd001",45,"A" 
db users insert({user_id:"bcd001",age:45,status:"A"})

2.查询语句

2.1 查询所有

1
2
SELECT * FROM users 
db.users.find()

2.2 返回特定字段

1
2
SELECT id,user_id,status FROM users     
db.users.find({},{user_id:1,status:1})

2.3 返回特定字段,且Mongodb不返回”_id”(“_id”默认都是返回的)

1
2
SELECT user_id,status FROM users
db.users.find({},{user_id:1,status:1,_id:0})

2.4 查询status=”A”

1
2
SELECT * FROM users WHERE status ="A"     
db.users.find({status:"A"})

2.5 查询status=”A”,限定返回字段user_id,status

1
2
SELECT 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
2
SELECT * FROM users WHERE status !="A"
db.users.find({status:{$ne:"A"}})

2.7 查询status=”A”且age=50

1
2
SELECT * FROM users WHERE status ="A" AND age = 50
db.users.find({status:"A",age:50})

2.8 查询status=”A”或者age=50

1
2
SELECT * FROM users WHERE status ="A" OR age=50
db.users.find({$or:[{status:"A"},{age:50}]})

2.9 查询age大于25

1
2
SELECT * FROM users WHERE age >25
db.users.find({age:{$gt:25}})

2.10 查询age小于25

1
2
SELECT * FROM users WHERE age<25
db.users.find({age:{$lt:25}})

2.11 查询age大于25且小于50

1
2
SELECT * FROM users WHERE age >25 AND age<=50
db.users.find({age:{$gt:25,$lte:50}})

2.12 查询包含字符串”bc”(模糊匹配)

1
2
SELECT * FROM users WHERE user_id like "%bc%"
db.users.find({user_id:/bc/})

2.13 查询以”bc”字符串开头

1
2
SELECT * FROM users WHERE user_id like "bc%"
db.users.find({user_id:/^bc/})

2.14 查询status=”A”,并且按照user_id正序排序

1
2
SELECT * 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
2
SELECT * FROM users WHERE status="A"ORDER BY user_id DESC
db.users.find({status:"A"}).sort({user_id:-1})

2.16 计总数

1
2
3
4
SELECT COUNT(*) FROM users
db.users.count()
or
db.users.find().count()

2.17 查询存在user_id的数据总数

1
2
3
4
SELECT 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
4
SELECT COUNT(*) FROM users WHERE age>30
db.users.count({age:{$gt:30}})
or
db.users.find({age:{$gt:30}}).count()

2.19 查询status字段的所有不同值(常用于得到某字段的取值范围)

1
2
SELECT DISTINCT(status) FROM users
db.users.distinct("status")

2.20 查询第一条数据

1
2
3
4
SELECT* FROM users LIMIT1
db.users.findOne()
or
db.users.find().limit(1)

2.21 查询地10-15条数据

1
2
SELECT * FROM users LIMIT 5 SKIP 10
db.users.find().limit(5).skip(10)

2.22 显示查询相关的详细信息

1
2
EXPLAIN SELECT * FROM users WHERE status ="A"
db.users.find({status:"A"}).explain()

3 更新语句
3.1 更新age>25的数据设置status=”c”(注意:MongoDB中如果不指定multi:true则只更新满足要求的第一条数据)

1
2
UPDATE users SET status="C" WHERE age>25
db.users.update({age:{$gt:25}},{$set:{status:"C"}},{multi:true})

3.2 更新status=”A”的数据设置每个age加3

1
2
UPDATE users SET age=age+3 WHERE status="A"
db.users.update({status:"A"},{$inc:{age:3}},{mult:true})

4 删除语句
4.1 删除status=”D”的数据

1
2
DELETE FROM users WHERE status="D"
db.users.remove({status:"D"})

4.2 删除user表

1
2
DELETE 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),而普通索引列表会包含,值为null

1
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 查询_id

1
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}})