mongo.md 12.2 KB
Newer Older
whatyn's avatar
1  
whatyn 已提交
1
# mongo
whatyn's avatar
fix  
whatyn 已提交
2 3 4 5 6 7 8 9
  
*   [1、说明](#introducer)
*   [2、增删改查](#crud)
*   [3、三种情况下mongo内嵌文档的查询与保存、](#innerDocument)


 <h2 id="introducer"></h2>

whatyn's avatar
1  
whatyn 已提交
10
## 1、说明
whatyn's avatar
fix  
whatyn 已提交
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
```
SQL术语/概念 	MongoDB术语/概念 	解释/说明
database 		database 			数据库
table 			collection 			数据库表/集合
row 			document 			数据记录行/文档
column 			field 				数据字段/域
index 			index 				索引
table 			joins 	  			表连接,MongoDB不支持
primary 		key 	primary key 	主键,MongoDB自动将_id字段设置为主键
```

```
启动mongo    /opt/sudytech/mongodb           ./bin/mongod --config mongo.conf
										     ./bin/mongod --config /opt/sudytech/mongodb/conf/mongo.conf 
											 
启动mongo
  /opt/sudytech/mongodb/bin/mongod --dbpath=/opt/sudytech/mongodb/data --logpath=/opt/sudytech/mongodb/logs --logappend  --port=27017 --fork
  
登陆mongo
cd /opt/sudytech/mongodb/bin
mongo
```
```
创建数据库
	use test
	db.test.insert({"name":"111"})
	
删除数据库	
	use test
	db.dropDatabase()

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


按时间查询
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()
    
```  

```
导出一个表(文档)  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/
```

<h2 id="crud"></h2>

whatyn's avatar
1  
whatyn 已提交
74
## 2、增删改查 
whatyn's avatar
fix  
whatyn 已提交
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 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359
```
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

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

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()       删除集合

复制数据库      db.copyDatabase(<from_dbname>, <to_dbname>, <from_hostname>);  例如:db.copyDatabase('test','test1');

导出一个表(文档)  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/


{ "_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})   

whatyn's avatar
1  
whatyn 已提交
360 361
```

whatyn's avatar
fix  
whatyn 已提交
362 363 364

 <h2 id="innerDocument"></h2>

whatyn's avatar
1  
whatyn 已提交
365
## 3、内嵌文档
whatyn's avatar
fix  
whatyn 已提交
366

whatyn's avatar
1  
whatyn 已提交
367
> 三种情况下mongo内嵌文档的查询与保存
whatyn's avatar
fix  
whatyn 已提交
368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458

```

一、内嵌文档(一个对象)
	"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为2和3的文档。不过既然已经得到了满足条件的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"}})

```
```

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

```
```

 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

```