包含标签 mongodb 的文章

当golang遇见工厂模式

工厂模式 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 介绍 意图 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 主要解决 接口选择的问题。 何时使用 我们明确地计划不同条件下创建不同实例时。 如何解决 让其子类实现工厂接口,返回的也是一个抽象的产品。 关键代码 创建过程在其子类执行。 应用实例 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 Hibernate 换数据库只需换方言和驱动就可以。 优点 一个调用者想创建一个对象,只要知道其名称就可以了。 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 屏蔽产品的具体实现,调用者只关心产品的接口。 缺点 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。 使用场景 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。 注意事项 作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。 实现 现在有几个小孩:小明、小红、小白,现在要实现他们分别介绍自己的程序。我们将创建一个Child接口和实现Child接口的类。下一步是定义工厂类ChildFactory。 定义Child接口 1 2 3 type Child interface { IntroduceYourself() } 定义小明、小红、小白三个Child实现类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 type Min struct { } func (Min) IntroduceYourself() { fmt.……

阅读全文

Gin上传文件到MongoDB gridfs

上传图片 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 func imagePost(c *gin.……

阅读全文

Golang mgo 模糊查询的使用

在日常使用的Mongodb中,有一项功能叫做模糊查询(使用正则匹配),例如: db.article.find({"title": {$regex: /a/, $options: "im"}}) 这是我们常用Mongodb的命令行使用的方式,但是在mgo中做出类似的方式视乎是行不通的: 1 2 3 query := bson.M{"title": bson.M{"$regex": "/a/", "$options": "im"}} 大家用这个方式去查询,能查询到算我输! 下面总结一下,正真使用的方式: 在Mongodb的命令行中,我们可以使用形如 \abcd\ 的方式来作为我们的pattern,但是在mgo是直接传入字符串来进行的,也就是传入的是"\a",而不是\a\。 根据第一点,我们将代码修改一下。 1 2 3 query := bson.M{"title": bson.M{"$regex": "a", "$options": "im"}} 但是我们会发现依然不能得到我们想要的结果,那么第二点就会产生了! 在mgo中要用到模糊查询需要mgo中自带的一个结构: bson.RegEx 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 // RegEx represents a regular expression.……

阅读全文

gin mongodb restful api设计: 动态的patch接口

什么是Patch? Patch方法可以用来更新资源的一个组成部分 什么时候使用Patch? 当你仅需更新资源的某一项,即不完全也不幂等 那当我们的模型在数据库中几乎每个字段都可能会遇到改变的时候,难道在patch的时候,或者专门写一个post的接口去一个一个if else操作吗,而我们又使用的是静态语言golang,有没有什么办法能够动态的让我们进行愉快的Patch呢? 答案当然是有的,先说说如何去实现: 我们需要利用golang的map[string]interface{}结构 我们需要一个动态的结构 在mgo中大多使用map[string]interface{}的结构,我们直接构造出这个结构有利于我们直接进行Update({"$set": xxxx})操作 使用BindJSON函数,当然你也可以使用Gin的其他函数对map[string]interface{}进行绑定,这里我们不使用一个struct进行绑定,原因是我们无法判断客户端,或者说是浏览器会传送哪些字段来,这样做也有利于我们客户端将某一个字段置为默认值(如果用struct就只能避开默认值了) 来,开始贴代码: 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 // 这个是我们需要存到数据库中的Model type Article struct { ID bson.……

阅读全文

redis_mongodb持久化的方式

redis持久化方式(两种) RDB持久化 redis提供了RDB持久化的功能,这个功能可以将redis在内存中的的状态保存到硬盘中,相当于snapshot,它可以手动执行,也可以再redis.conf中配置,定期执行。 相关配置 databases 配置db文件的数目,可以用select dbid 指令为每个连接指定后续持久化时的db文件,新连接默认均使用db 0 save SNAPSHOTTING的持久化方式有多种save策略可供选择,而且支持混用,例如: save 900 1 save 300 100 save 60 10000 上述配置的效果是:snapshotting会在3个条件中的任何一个满足时被触发: 900s内至少1个key有变化; 300s内至少100个key有变化; 60s内至少有10000个key有变化 save条件被触发时,Redis通过fork子进程,由子进程在后台实现异步dump磁盘。根据fork的写时复制策略,若持久化过程中出现很多写入请求,在最坏的情况下,需要的内存是当前数据集所占内存的2倍。 备注1:上述配置的3个触发条件其实是逐次加强的,哪个条件先满足就先触发那个save策略。 备注2:如果业务不需要持久化或不需要RDB方式的持久化,可以通过注释掉save配置项来实现 stop-writes-on-bgsave-error 指定Redis在后台dump磁盘出错时的行为,默认为yes,表示若后台dump出错,则RedisServer拒绝新的写入请求,通过这种方式来引起用户警觉,避免因用户未发现异常而引起更大的事故。 rdbcompression RDB文件是否压缩存储,若为yes,会在压缩时消耗一点CPU,但省磁盘空间。 rdbchecksum RDB文件是否需要CRC64校验, 若为yes,会在生成RDB文件后计算其CRC64并将结果追加至文件尾,同样,Redis启动Load RDB时,也会先计算该文件的CRC64并与dump时的计算结果对比。  好处:可以严格保证RDB的完整性及安全性  代价:会在dump或load时损失10%的性能。如果要最大化Redis的性能,这个配置项应该用no关掉 dbfilename 指定RDB文件名,默认为dump.rdb dir 指定RDB文件存放目录的路径,若包含多级路径,则相关父路径需事先mkdir出来,否则启动失败。 AOF持久化 AOF持久化(Append-Only-File),与RDB持久化不同,AOF持久化是通过保存Redis服务器锁执行的写状态来记录数据库的,即commandlog。……

阅读全文