使用背景:
项目中需要存储一些下游的需求,需求的的格式是个树形的格式,例如某个需求里面包含n个城市某个品牌某个车系,可以简化成下图。(只是作为使用场景来分析,可以跳过)
按照关系型数据库来说的话,有两种方案:
1 需要3张表来实现下面的机构需要需求表存储需求的基本信息,需求和城市的关联表(一个需求对多个城市),需求、城市、车系的关联关系表(一个城市的某个需求下面有多个车系)。
2 一张表存储:一个需求对应多行记录,每行记录中的最小粒度是城市,城市中的车系用逗号拼接。如下图:
需求id | 城市id | 车系 |
需求1 | 城市1 | 车系1,车系2 |
需求1 | 城市2 | 车系1 |
缺点:如果使用第一种的话,会很麻烦,需要建3张表,需要做关联查询,数据有很多冗余的;使用第二种的话,由于存在车系1,车系2这种存储,如果根据车系进行查询的话,需要使用find_in_set函数,如果数据量在比较大的情况下,性能是个大问题。
对于这种数据,所以决定选择使用mongodb来进行存储。如果多个城市或者多个车系的话,使用mongo种的array来进行存储。
基本操作
由于项目是使用spring data mongodb来进行的crud操作,基本的操作都已经做了封装,确实是可以对mongodb的语法进行屏蔽,但是对于一些复杂性的查询,以及一些索引的建立,还是需要对mongodb的语句等各方面的东西进行了解的。所以先翻看了一下菜鸟教程,希望能最快速的掌握基础及常用的语法,以便后续查看,后续再对一些高级的东西进行补充。
- mongodb连接串:
mongodb://fred:foobar@localhost/baz 使用用户名fred,密码foobar登录localhost的baz数据库。
- 数据库相关
use jxt 创建数据库 jxt ,如果该数据库已经存在,则切换到这个数据库。可以通过show dbs来查看所有的数据库,此时是显示不出来这个数据库的, 要显示它,我们需要向 jxt 数据库插入一些数据。
如果需要删除jxt数据库的话,需要切换到jxt这个数据库,通过db查看当前所在的数据库,如果不是的话,可以通过use jxt 切换到数据库jxt,通过db.dropDatabase()来删除当前的数据库。
- 表相关(collection)
创建表的话,可以通过db.createCollection(name, options) 来创建,但是一般情况下我们是不需要手动创建的,直接插入数据的时候会自动创建相应的表。手动创建的时候可以在name中指定表的名字,options中配置一些参数。如下:
db.createCollection("mycol", { capped : true, autoIndexId : true, size :
6142800, max : 10000 } )
创建固定大小的表 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。下面是参数的解释:
删除表:db.mycol2.drop() 其中mycol2为表名。
插入数据:db.collection.insertOne() 和 db.collection.insertMany()。 一个是插入一条,一个是插入多条,插入多条的时候数据是一个数组。
更新数据:db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } );例如:db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}}) 会将title=MongoDB 教程 数据改为MongoDB。
删除数据:db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )
查询待记录。。。