This post is also available in English and alternative languages.1. 基本操作
1 2 3 4 5 6 7 8 9 10 11
| db.auth('用户名', '密码')
show dbs;
use 库名
show tables;
|
2. 插入
insert函数添加一个文档到集合里面。向数据库插入数据,没有指定ID,mongodb 会自动添加一个全局唯一的ID。
2.1. 方式一
首先可以创建一个局部变量post,然后用insert存入表中。
1 2 3 4 5 6
| post = { "title":"My Blog Post", "content":"Here's my blog post", "date": new Date() } db.myblog.insert(post)
|
2.2. 方式二
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| db.user.insert({"name":"Java","age":0}) db.user.insert({"name":"C++","age":1}) db.user.insert({"name":"C--","age":2}) db.user.insert({"name":"Python","age":3}) db.user.insert({"name":"JavaScript","age":4}) db.user.insert({"name":"AngularJs","age":5}) db.user.insert({"name":"jQuery","age":6}) db.user.insert({"name":"Go","age":7}) db.user.insert({"name":"IOS","age":8}) db.user.insert({"name":"Android","age":9}) db.user.insert({"name":"ExtJs","age":10})
db.userInfo.insert({"name":{"first":"Json","last":"Boume"},"age":11})
db.food.insert({"fruit":["apple","banana","peach"]}) db.food.insert({"fruit":["apple","kumquat","orange"]}) db.food.insert({"fruit":["cherry","banana","apple"]}) db.food.insert({"fruit":["apple","banana"]})
|
3. 查询
3.1. 普通查询
查询语句 | 含义 |
---|
db.user.find(); | 查询user表下所有的数据,shell默认显示20条 |
db.user.findOne(); | 查看user表下的一条数据 |
db.user.find().count(); | 查看user表中有多少条数据 |
db.user.find({"name":"Java"}); | 查询name对应的数据 |
db.user.find({"name":"Java","age":0}); | 多条件查询,每个条件的关系是 “and” |
db.user.find({},{"name":1}); | 指定返回的键,此处指定返回"name" |
db.user.find({},{"name":1,"_id":0}}); | 指定返回符合的"name",并且屏蔽"_id"字段(不屏蔽,每次查询默认出现) |
db.user.find({},{"name":1,"age":1,"_id":0}); | 指定返回"name",“age"两个字段,并且屏蔽”_id"字段 |
3.2. 条件查询
函数 | 函数含义 | 示例语句 | 语句含义 |
---|
\$lt | 小于 | db.user.find({"age":{"\$lt":5}}); | 查询 age小于5 的数据(不包含5) |
\$lte | 小于等于 | db.user.find({"age":{"\$lte":5}}); | 查询 age小于等于5 的数据 |
\$gt | 大于 | db.user.find({"age":{"\$gt":5}}); | 查询 age大于5 的数据(不包含5) |
\$gte | 大于等于 | db.user.find({"age":{"\$gte":5}}); | 查询 age大于等于5 的数据 |
\$ne | 不相等 (取反值) | db.user.find({"age":{"\$ne":5}}); | 查询 age不等于5 的数据 |
\$in | 用来查询一个键的多个值 (支持不同的数据类型) | db.user.find({"age":{"\$in":[0,1,2]}}); | 查询user表,age字段为0,1,2的数据 |
\$nin | 返回与查询条件不匹配的数据("$in"的反义) | db.user.find({"age":{"\$nin":[1,2]}}); | 显示"age"不为1,2的所有数据 |
\$or | "or"接受一个包含所有可能条件的数组作为参数 | db.user.find({"\$or":[{"age":{"\$in":[1,2]}},{"name":"ExtJs"}]}); | 查询age为1,2,或者name为ExtJs的数据 |
3.3. 组合查询
1
| db.user.find({"age":{"\$lt":5,"$gt:0"}})
|
函数 | 函数含义 | 示例语句 | 语句含义 |
---|
limit | 限制结果数量(指定上限,而非下限) | db.user.find().limit(5); | 查询的全部数据中,只显示前面5条数据 不加"limit(5)",会显示全部的数据,加上之后,就显示前五条 |
skip | 限制结果数量(指定下限,而非上限) | db.user.find().skip(3); | 查询全部数据,不显示前三条,显示三条数据之后的数据(丢弃前三条)。 |
sort | 升序/降序 (-1:降序/从大到小,1:升序/从小到大) | db.user.find().sort({"age":-1})
db.user.find().sort({"age":1})
db.user.find().sort({"name":1,"age":-1}) | 查询user全部数据,按照age降序 查询user全部数据,按照age升序 查询user全部数据,按照name升序,age降序 |
3.4. 日期查询
1 2 3 4
| (模拟 查找2007/1/1 前注册的数据)
start = new Date("01/01/2007") db.user.find({"registered":{"$lt":start}})
|
3.5. 数组查询
1
| db.food.find({"fruit":"apple"})
|
函数 | 函数含义 | 示例语句 | 语句含义 |
---|
\$all | 通过多个元素来匹配数组 这个函数,没有双引号!! | db.food.find({"fruit":{\$all:["apple","banana"]}}); | 查询既有"apple"又有"banana"的数据 |
\$size | 可以使用其查询指定长度的数组 | db.food.find({"fruit":{"\$size":2}}) | 查询fruit数组长度为2的数据 |
3.6. 内嵌文档查询
示例语句 | 语句含义 |
---|
db.userInfo.find({"name.first":"Json"}); | 查询"name"下面,"first"为"Json"的数据。 |
db.userInfo.find({"name.first":"Json","name.last":"Boume"}); | 查询"name"下面,“first"为"Json”,"last"为"Boume"的数据。 |
3.7. 聚合查询
函数 | 函数含义 | 示例语句 | 语句含义 |
---|
count() | 放回当前表中文档的数量 | db.user.find().count(); | 返回user表中,文档的数量。 |
distinct | 用来找出给定键的不同的值(去重) | db.runCommand({"distinct":"user","key":"age"}); | runCommand是关键字,distinct对应的是表名,key对应的是指定的键 |
3.8. 正则
详见:regex - mongodb document
3.8.1. 模糊查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| db.news_info.find( { "title": { "$regex": "^.*白天.*$" ,"$options": "i" } }, {title: 1} )
db.news_info.find( { title: { $regex: /白天/, $options: "i" } }, {title: 1} )
db.testData.find( { name: { $regex: /j/i } } )
|
"$options": "i"
:不区分大小写。
3.8.2. 头匹配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| db.news_info.find( { "title": { "$regex": "^这", "$options": "m" } }, {title: 1} )
db.news_info.find( { title: { $regex: /^这/, $options: 'm' } }, {title: 1} )
db.news_info.find( { title: { $regex: /^这/m } }, {title: 1} )
|
3.8.3. 尾匹配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| db.news_info.find( { "title": { "$regex": "了$", "$options": "i" } }, {title: 1} )
db.news_info.find( { title: { $regex: /了$/} }, {title: 1} )
|
3.8.4. $in
不能在 $in
内使用 $regex
运算符表达式,只能使用 JavaScript 正则对象(即 /pattern/
)。
1 2 3 4 5 6
| db.news_info.find( { title:{ $in: [ /^白天/i, /^这/ ] } }, {title:1} )
|
4. 更新
update最少接收两个参数,第一个是要更新文档的限定条件.第二个是新的文档。
假设要给文档新增一个值,则需要增加一个新的键。
1 2
| post = [] db.myblog.update({"title":"My Blog Post"},post)
|
5. 删除
示例语句 | 语句含义 |
---|
db.user.remove({"name":"Java"}); | 删除name为"Java"的数据 |
db.user.remove(); | 这个命令会删除user集合中的所有的文档,但不会删除集合本身 |
db.myblog.drop(); | 删除myblog表 |
6. 索引
6.1. 查询索引
6.2. 查询索引大小
1
| db.user.totalIndexSize()
|
6.3. 添加唯一索引
1 2 3 4
| db.user.createIndex({name:1},{unique:true})
db.user.createIndex({name:1,age:1},{unique:true})
|
6.4. 删除索引
1
| db.user.dropIndex("name_1")
|
7. Reference