Mongodb 操作
2025-01-22 08:19:30    2.1k 字   
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
-- key:value(字段)
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})

-- key:value(对象、内嵌)
db.userInfo.insert({"name":{"first":"Json","last":"Boume"},"age":11})

-- key:value(数组)
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

  • $regex 表达式

    1
    2
    3
    { <field>: { $regex: /pattern/, $options: '<options>' } }
    { <field>: { $regex: 'pattern', $options: '<options>' } }
    { <field>: { $regex: /pattern/<options> } }
  • JavaScript 正则对象,即 /pattern/

    1
    { <field>: /pattern/<options> }

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. 查询索引

1
db.user.getIndexes()

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