数据库

Elasticsearch批量insert和批量upsert

月盾
golang版本的elasticsearch批量插入和批量更新方法如下: package main import ( "github.com/elastic/go-elasticsearch/v8" "github.com/elastic/go-elasticsearch/v8/esutil" ) func main() { list:=make(User, 0) bulkES(list) } func bulkES(list []User) error { indexer, err := esutil.NewBulkIndexer(esutil.BulkIndexerConfig{ Index: "search-user", Client: ES, }) if err != nil { return err } for _, v := range list { data, err := json.Marshal(v) if err != nil { return err } err = indexer.Add( context.Background(), esutil.BulkIndexerItem{ Action: "index", Body: bytes.NewReader(data), }, ) if err != nil { return err } } indexer.

go mongo-driver动态条件

月盾
在go mongo中查询是使用的是bson.M类型的条件,但是直接使用时无法动态添加条件,只能初始化赋值,bson.M其实就是map类型,只能使用someMap[“someKey”]=“someValue” 的形式添加,这样的话只能是用if判断字段的值来决定是否添加map key/value,写起来比较繁琐。还有一种是利用结构体转换为bson.M来实现。 //构造一个查询结构体 search := User{ ID: id, Name: name, Age: age, } //构造一个条件变量 condition := bson.M{} //将结构体转为字节数组,userInfo中的字段根据需要设置值,需要保证没有值时不会有默认值出现 userbyte, err := bson.Marshal(search) if err != nil { return user, err } //将字节码转为bson.M类型 bson.Unmarshal(userbyte, &condition) log.Println(condition) if err = this.mongo.Collection("user").FindOne(context.TODO(), condition).Decode(&user); err != nil { return user, err } 以上基本就实现了动态条件查询的效果,其中: search := User{ ID: id, Name: name, Age: age, } search结构中的字段可能值为空,假设在前端并未传递age字段,那么最终condition=map[id:xxx,name:xxx],并不会出现age:0这个的字段,有效避免了零值情况。

免费的mongodb集群

月盾
mongodb提供了免费的mongodb集群可用于学习使用 https://www.mongodb.com/cloud 并且有3个节点 mongodb Atlas免费集群存储空间为512M,这对于个人项目来说足够使用(本博客运行6年使用空间8M)。 本地客户端连接mongo Atlas 复制了连接字符串后直接粘贴到客户端中,替换,点击From SRV,会自动拉取集群配置,点击Test测试连接是否成功。

mongodb创建新数据库和创建用户

月盾
使用mongodb数据库时有这样的场景,使用可视化工具登陆了某个数据库blogs,然后又创建了数据库website,给website数据库添加用户hp_website db.createUser( {user: "hp_website",pwd: "xxxxxx",roles: [ { role: "userAdmin", db: "website" },{ role: "dbAdmin", db: "website" },{ role: "dbOwner", db: "website" } ]}) 退出后使用bbb-user登陆数据库bbb却发现登陆不上去。登陆aaa数据查看用户db.getUsers()显示 虽然创建了很多用户,但db值都是blogs,显然是不对的。即时使用use website后创建用户也是不对。 正确的做法是关闭数据库认证,使用不带--auth启动数据库,使用命令行来创建 use website db.createUser( {user: "username",pwd: "xxxxxx",roles: [ { role: "userAdmin", db: "website" },{ role: "dbAdmin", db: "website" },{ role: "dbOwner", db: "website" } ]}) 这样就可以登录了。由于数据库和用户名是绑定的,只有确保用户是创建在对应数据库上才行。

linux修改MySQL 5.7.22字符集为utf8

月盾
网上也找了很多方案结果就是奇葩的不成功,最后直接修改/etc/mysql/mysql.conf.d/mysqld.cnf成功了。 在该文件最后添加 default-storage-engine=INNODB character-set-server=utf8 collation-server=utf8_general_ci 重启成功。 这是本地虚拟机里的mysql mysql> show variables like "character%"; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 完全正确,但是修改阿里云服务器以后还是有点小问题 character_set_database这一项还是latin1,不过似乎并不影响。 友情提示:纠正了mysql字符集发现新建的表还是latin1字符集,那有可能是该数据库本身的字符集就不对,可以试着看看。

mongodb forEach替换文本

月盾
最近七牛云存储要收回测试域名,但是我的博客中图片使用了这些测试域名,所以要替换掉,避免图片不可访问。在文档中没有找到可以直接替换的方法,所以就使用了mongodb的forEach循环替换。 首先用正则查询法查出使用了测试域名的文档,然后forEach循环,在每个循环中使用js的正则替换函数将域名替换掉,最后再保存该文档即可。 db.getCollection('blogs').find({content:{$regex:/hopefully.qiniudn.com/}}).forEach(function(item){ item.content = item.content.replace(/hopefully.qiniudn.com/g, 'hopefully-img.yuedun.wang') db.getCollection('blogs').save(item) print(">>", item.content); })

mongoose查询没有响应

月盾
使用mongoose建立了连接以后,通过model查询数据,如:testModel.find(),既不报错又不返回数据。 const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/my_database'); 使用mongoose.connect连接产生在mongoose.connection上,使用mongoose.createConnection是反回一个连接对象,建立model的时候需要使用这个连接才有效,此时使用mongoose.model是无效的。 const conn = mongoose.createConnection('your connection string'); const MyModel = conn.model('ModelName', schema); const m = new MyModel; m.save(); // 可以工作 vs const conn = mongoose.createConnection('your connection string'); const MyModel = mongoose.model('ModelName', schema); const m = new MyModel; m.save(); // 不能工作

读写数据库与读写文件哪个更快?

月盾
由于开发物流信息网,关于这个问题也是最近才想到的,就是到底读文件更快还是读数据库更快,能快多少,书生也搜索过,没见有网友就这个问题答复过, 也可能是太简单的缘故,我们本文还是来实测一下,由于时间关系,VC还没装,书生先用PHP测试了一下,下次有时间在C/C++上补充测试到本文来,因为 PHP的底层解析应该也是基于C的,所以估计两者环境测试结果差不多,小问题大收获,现在就来看一下测试过程及结果。 测试程序如下: //说明1:由于读数据库语句调用简单的封包函数两次,所以把读文件也改成连续调用两次,数据库记录ID为1就在第一条,并且唯一索引。 //说明2:测试两次一次是4K数据,一次是整形数据 set_time_limit(0); function fnGet($filename) { $content = file_get_contents($filename); return $content; } function fnGetContent($filename) { $content = fnGet($filename); return $content; } $times=100000; echo '数据库查询结果:<br/>'; //--------------------------------- $begin=fnGetMicroTime(); for($i=0;$i<$times;$i++) { $res=$dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'"); $row=$dbcon->mydb_fetch_row($res); $content=$row[0]; } echo 'fetch_row '.$times.' 次时间:<font color=red>'.(fnGetMicroTime()-$begin).'</font>秒<br/>'; //--------------------------------- $begin=fnGetMicroTime(); for($i=0;$i<$times;$i++) { $res=$dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'"); $row=$dbcon->mydb_fetch_array($res); $content=$row['log_Content']; } echo 'fetch_array '.$times.' 次时间:<font color=red>'.(fnGetMicroTime()-$begin).'</font>秒<br/>'; //--------------------------------- $begin=fnGetMicroTime(); for($i=0;$i<$times;$i++) { $res=$dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'"); $row=$dbcon->mydb_fetch_object($res); $content=$row->log_Content; } echo 'fetch_object '.

open() is deprecated in mongoose >= 4.11.0, use openUri()

月盾
`open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMongoClient` option if using `connect()` or `createConnection()`. See http://mongoosejs.com/docs/connections.html#use-mongo-client Db.prototype.authenticate method will no longer be available in the next major release 3.x as MongoDB 3.6 will only allow auth against users in the admin db and will no longer allow multiple credentials on a socket. Please authenticate using MongoClient.connect with auth credentials. 修改连接参数: url = `mongodb://${this.username}:${this.password}@${this.host}:${this.port}/${this.dbName}`; const opts = { // autoReconnect: false,//默认true // reconnectTries: 30,//尝试重连,默认30次 // reconnectInterval: 1000, //重连间隔,默认1000毫秒 loggerLevel: "warn", //error/warn/info/debug useMongoClient: true }; mongoose.

mongoose自动添加createdAt和updatedAt

月盾
export var CommentSchema: Schema = new Schema({ Id: String, content: String, status: { type: Boolean, default: true } }, { timestamps: true}); 添加{ timestamps: true}选项即可,如果需要自定义属性名称可以直接指定: { timestamps: {createdAt:'created_at', updatedAt:'updated_at'}}