2023-08-12 15:16:27

# mongo

# 1、说明

SQL术语 MongoDB术语 说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

启动mongo    /opt/sutech/mongodb           ./bin/mongod --config mongo.conf
										   ./bin/mongod --config /opt/sutech/mongodb/conf/mongo.conf 
											 
启动mongo
/opt/sutech/mongodb/bin/mongod --dbpath=/opt/sutech/mongodb/data --logpath=/opt/sutech/mongodb/logs --logappend  --port=27017 --fork
  
登陆mongo
cd /opt/sutech/mongodb/bin
mongo
1
2
3
4
5
6
7
8
9

显示数据库      show dbs
显示集合(表)  show collections
显示文档(行)  db.test.find()
复制数据库      db.copyDatabase(<from_dbname>, <to_dbname>, <from_hostname>);  例如:db.copyDatabase('test','test1');

创建数据库
	use test
	db.test.insert({"name":"111"})
	
删除数据库	
	use test
	db.dropDatabase()
	

按时间查询
db.getCollection('mongomessage').find({createTime:{$gt:ISODate("2018-06-28T22:00:00.000Z")}}).count

db.getCollection('mongomessage').find({fromAddress:'uc_b:(71133)一卡通余额提醒',createTime:{$gt:ISODate("2018-06-28T22:00:00.000Z")}}).count()

db.getCollection('mongomessage').find({fromAddress:'uc_b:(71135)学生课表信息提醒',createTime:{$gt:ISODate("2018-06-28")}}).count()

db.getCollection('mongomessage').find({fromAddress:'uc_b:(71134)教师课表信息提醒',createTime:{$gt:ISODate("2018-06-28T22:00:00.000Z")}}).count()
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

导出一个表(文档)  E:\Program Files (x86)\mongo\bin>mongoexport -d ucpplus1 -c mongomsgbody -o e:\mongomsgbody.bak.json
导入一个表(文档)  E:\Program Files (x86)\mongo\bin>mongoimport -d test -c mongo1 e:\mongomsgbody.bak.json


导出数据库(备份)  E:\Program Files (x86)\mongo\bin>mongodump -d ucpplus1 -o e:\my_mongodb_dump
导入数据库(还原)  E:\Program Files (x86)\mongo\bin>mongorestore -d ucpplus3 e:\ucpplus1_dump\ucpplus1

(还原时的数据目录必须是原来新建的目录与备份的数据库名称结合。数据库名称与原来一样是还原数据。数据库名称不一样会新建一个数据库)

https://www.cnblogs.com/qingtianyu2015/p/5968400.html

./mongodump -d ucpplus -o /home/mongobak/ucpplus/

1
2
3
4
5
6
7
8
9
10
11
12
13


{ "_id" : ObjectId("4e3f42f36266b5845052c03d"), "Bpid" : [ { "$ref" : "B", "$id" : ObjectId("4e3f3de16266b5845052c036") } ], "value" : 5 }  

http://lhkzyz.iteye.com/blog/1669796
内嵌文档查询
    db.teacher.find("$elemMatch":{"students.age":"15","students.hobby":"football"})  

    db.teacher.find({"students:"{"$elemMatch":{"age":"15","hobby":"football"}}})  


正则查询 (忽略大小写)
	db.getCollection('channelmessagestate').find({ "orignTo" : { "$regex" : ".*uc_u:\\(2\\).*" , "$options" : "i"} } )
	
	db.getCollection('channelmessagestate').find({"recipientBy.address":{ "$regex" : ".*uc_u:\\(2\\).*" , "$options" : "i"} } )

http://www.runoob.com/mongodb/mongodb-query.html


排序  sort()方法可以通过参数指定排序的字段,并使用 1-1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。

db.getCollection('mongomessage').find({}).sort({"createTime":-1})   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 2、增删改查

1 列出并选用

1.1 列出所有数据库

> show dbs 
local  0.000GB
myblog 0.000GB


1.2 使用某个数据库

> use myblog
switched to db myblog


查看数据库空间大小
db.stats(1073741824);//得到的是G单位的


1.3 列出所有集合

> show collections
articles
replicationColletion
sessions
users
wangduanduan


2 插入数据 insert(value)
	
// 在已经存在的集合中插入数据
> db.users.insert({name:'hh',age:23})
Inserted 1 record(s) in 43ms
 
// 在不存在的集合中插入数据,集合不存在则自动创建集合并插入
> db.students.insert({name:'hh',age:23})
Inserted 1 record(s) in 72ms

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
3 查询 find(option)

3.1 查询集合里所有的文档

> db.users.find()
/* 1 */
{
  "_id" : ObjectId("583e908453be942d0c5419dc"),
  "login_name" : "wangduanduan",
  "password" : "wrong age"
}
 
/* 2 */
{
  "_id" : ObjectId("583ed2a5cc9a937db049616d"),
  "login_name" : "hh",
  "password" : "sdfsdf"
}
 
/* 3 */
{
  "_id" : ObjectId("583fb2e9b12f8b7a7aa37572"),
  "name" : "wangduanduan",
  "age" : 34.0
}
 
/* 4 */
{
  "_id" : ObjectId("583fb707b12f8b7a7aa37573"),
  "name" : "hh",
  "age" : 23.0
}

3.2 按条件查询文档
	
> db.users.find({name:'wangduanduan'})
/* 1 */
{
  "_id" : ObjectId("583fb2e9b12f8b7a7aa37572"),
  "name" : "wangduanduan",
  "age" : 34.0
}

注意

// 这是错的,查不到结果
> db.users.find({_id:'583fb2e9b12f8b7a7aa37572'})
Fetched 0 record(s) in 1ms


// 这是正确的
> db.users.find({_id:ObjectId('583fb2e9b12f8b7a7aa37572')})
/* 1 */
{
  "_id" : ObjectId("583fb2e9b12f8b7a7aa37572"),
  "name" : "wangduanduan",
  "age" : 34.0
}


3.3 查询集合内文档的个数

> db.users.count()
4

3.4 比较运算符

$gt: 大于

$gte: 大于等于

$lt: 小于

$lte: 小于等于

$ne: 不等于

	
// 查询用户里年龄大于30岁的人, 其他条件以此类推
> db.user.find({age:{$gt:30}})
 
/* 1 */
{
  "_id" : ObjectId("583fb2e9b12f8b7a7aa37572"),
  "name" : "wangduanduan",
  "age" : 34.0
}


3.5 逻辑运算符

3.5.1// 查询名字是wangduanduan,age=34的用户
> db.users.find({name:'wangduanduan',age:34})
/* 1 */
{
  "_id" : ObjectId("583fb2e9b12f8b7a7aa37572"),
  "name" : "wangduanduan",
  "age" : 34.0
}

3.5.2 $in// 查询名字是wangduanduan,或hh的用户
> db.users.find({name:{$in:['wangduanduan','hh']}})
/* 1 */
{
  "_id" : ObjectId("583fb2e9b12f8b7a7aa37572"),
  "name" : "wangduanduan",
  "age" : 34.0
}

3.5.3 $nin 非

// 查询名字不是wangduanduan或者hh的用户
> db.users.find({name:{$nin:['wangduanduan','hh']}})
/* 1 */
{
  "_id" : ObjectId("583e908453be942d0c5419dc"),
  "login_name" : "wangduanduan",
  "password" : "wrong age"
}
 
/* 2 */
{
  "_id" : ObjectId("583ed2a5cc9a937db049616d"),
  "login_name" : "hh",
  "password" : "sdfsdf"
}


3.6 正则匹配

// 查询名字是中含有duan的用户
> db.users.find({name:/duan/})
/* 1 */
{
  "_id" : ObjectId("583fb2e9b12f8b7a7aa37572"),
  "name" : "wangduanduan",
  "age" : 34.0
}
 
/* 2 */
{
  "_id" : ObjectId("583fc919b12f8b7a7aa37575"),
  "name" : "wangduanduan",
  "age" : 45.0
}


3.7 大招$where

// 返回含有login_name字段的文档
db.getCollection('users').find({$where:function(){
  return !!this.login_name;
}})

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
4 更新 update();

4.1 整体更新

> db.users.update({login_name:'wangduanduan'},{name:'heihei',age:34})
Updated 1 existing record(s) in 116ms

4.2 $set 局部更新

// 只是将用户年龄设置成101
> db.users.update({name:'wangduanduan'},{$set:{age:101}})

4.3 $inc

// 将用户年龄增加1岁,如果文档没有age这个字段,则会增加这个字段
> db.users.update({name:'wangduanduan'},{$inc:{age:1}})

4.3 upsert操作

// 如果查不到文档,则增加文档
> db.users.update({name:'nobody'},{$inc:{age:1}},true)
Updated 1 new record(s) in 3ms

/* 6 */
{
    "_id" : ObjectId("583fd20f2cfa6a4817c4171c"),
    "name" : "nobody",
    "age" : 1.0
}

db.student.update({"name":"李四","class"://},{$set:{"teacher":"老师","school":"行知学校"}})

 $inc 就是专门用来增减数字的。且只能用于整型、长整型或者双精度浮点型的值。其他类型的数据会操作失败。
 $inc 键的值必须为数字”,不能使用字符串、数组或者其他非数字的值。要修改其他类型,应该使用 $set 或者数字修改器。
 

4.4 批量更新

// upadate 的第四个参数设置成true的时候,就会批量更新
> db.users.update({name:'wangduanduan'},{$set:{age:1891}},false,true)


5 删除

// 删除某些文档
db.person.remove({"name":"joe"})

// 删除整个集合
db.test1.remove({})   删除集合中的文档
db.test1.drop()       删除集合

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

# 3、内嵌文档

三种情况下mongo内嵌文档的查询与保存

1、内嵌文档(一个对象)
	"recipientBy" : {                                    // 发给用户时收件人类型、id、名称
			"type" : 0,
			"address" : "uc_u:(2)71070001"                   
		}
	
https://segmentfault.com/q/1010000000710641/a-1020000000711864

查询语句可以简化一下,如下:

db.demo.find({"people_id" : 1, "albums.privilege": 5})
查询结果返回的是满足匹配条件的文档,虽然可以映射返回的字段,不过还真不能只返回你说的id为23的文档。不过既然已经得到了满足条件的json文档,可以写程序来获取想要的内嵌子文档吧。

更新语句如下:

db.demo.update({people_id:2, "albums.id":2}, { $set : {"albums.$.name":6 }})


db.demo.update({ "_id" : { "$oid" : "5ac2de789e15ae8da0b49493"}},{ "$set" : { "recipientBy.address" : "uc_b:(12)张hezi"}})

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2、内嵌文档(数组内多个对象)
"mongoChannelTargets" : [                         //收件对象              
        {
            "channelIds" : [ 
                3, 
                4
            ],
            "address" : "uc_o:(8)金智",              //收件人为机构
            "type" : 0
        }, 
        {
            "channelIds" : [ 
                3, 
                4
            ],
            "address" : "uc_u:(7)组用户1",          //收件人为用户
            "type" : 0
        }]
		

https://blog.csdn.net/drifterj/article/details/7833883
db.blogs.find({"comment":{"$elemMatch":{"author":"joe", "score":{"$gte":3}}}});  



https://blog.csdn.net/qq_20127333/article/details/51508863
操作符:$set修改数组中的元素

例句:db.blog.update({"comments.testAdd":"T"},{$set:{"comments.$.testAdd":"z"}});

这里注意第一个查询条件必须数组.字段名,否则修改失败,有人可能会问后面的{"comments.$.testAdd":"z"}中的$符是干嘛用的,他在这里面代表的相当于是数组的下表,如果我们明确的知道下标的话,我们完全可以这么写,比如下表为0{"comments.0.testAdd":"z"},但大多数情况下我们是不知道下标的,所以用通配符$来表示,这样只会修改匹配的第一条数据,而不是所有匹配到的数据,这点需要注意


https://blog.csdn.net/leshami/article/details/55192965 
 db.students.update(
        ... { _id: 7, "grades.grade": 85 },
        ... { $set: { "grades.$.grade1" : 6 } })

 db.demo.update(		
{ "mongoChannelTargets.address" : "uc_u:(2)组用户111" , "_id" : { "$oid" : "5ac2de779e15ae8da0b49400"}},{ "$set" : { "mongoChannelTargets.$.address" : "uc_u:(11)张name"}})

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
3、内嵌文档(数组)		
to" : [                                         //收件人类型、id、名称
        "uc_o:(8)金智",                 
        "uc_g:(3)3", 
        "uc_a:(4)通讯录1", 
        "uc_u:(3)徐", 
        "uc_u:(4)花", 
        "uc_u:(6)王", 
        "uc_u:(2)彭", 
        "uc_u:(7)组用户1",
		"uc_b:(7)消息盒1"
    ]	

https://blog.csdn.net/qingyuanluofeng/article/details/49148327

db.fruitshop.find({"fruits":{"$all":["apple","banana"]}}); 
{ "boxIds" : { "$all" : [ 8]}}

http://www.cnblogs.com/ginb/p/6200721.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

mongodb (opens new window) runoob (opens new window) xushufa.cn (opens new window)