mongodb

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测试连接是否成功。

golang操作mongodb

月盾
在之前mgo是一个使用广泛的mongodb驱动器,不过从2018年开始已不再维护,虽然觉得怪可惜的,但也不推荐使用了,毕竟mongodb本身一直在迭代,如果驱动器不更新后续也没法使用。 详细说明见仓库:https://github.com/go-mgo/mgo 而mongodb提供了官方驱动,目前能找到的中文文档大多比较旧了,推荐直接看官方文档,有完整的操作手册:https://www.mongodb.com/blog/search/golang 本文也不想做一次搬运工,毕竟也不能随时保持更新,还是直接看官方文档比较好。下面列出一些主要的文章链接: Stack Overflow Research of 100,000 Developers Finds MongoDB is the Most Wanted Database (2019-2-2) Official MongoDB Go Driver Now Available for Beta Testing (2019-2-2) mongodb将为go提供官方驱动支持 MongoDB Go Driver Tutorial (2019-5-30) MongoDB Go驱动程序教程 Go Migration Guide (2019-2-2) 从社区驱动(mgo)迁移到官方驱动 MongoDB Stitch Functions – The AWS re:Invent Stitch Rover Demo(2019-10-15) Calling the MongoDB Atlas API - How to do it from Go(2019-3-18) MongoDB Go Driver Tutorial Part 1: Connecting, Using BSON, and CRUD Operations(2019-4-23)

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" } ]}) 这样就可以登录了。由于数据库和用户名是绑定的,只有确保用户是创建在对应数据库上才行。

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(); // 不能工作

新阿里云服务器一些基本设置

月盾
修改terminal apt-get update更新软件源,安装zsh,设置默认terminal为zsh,chsh -s /usr/bin/zsh。非root用户需要在root权限下修改/etc/passwd文件才能实现。 安装git apt-get install git nginx设置: sudo /etc/init.d/nginx restart # or start, stop 或 sudo service nginx restart # or start, stop 有时候我们改了配置文件只是要让配置生效,这个时候不必重启,只要重新加载配置文件即可。sudo nginx -s reload 目录/etc/nginx/sites-available/下增加文件配置反向代理,并软链接到/etc/nginx/sites-enabled/下 mongodb导入数据 启动: /usr/local/mongodb/bin/mongod –dbpath=/usr/local/mongodb/data –logpath=/usr/local/mongodb/logs –logappend –auth –fork 如需外网客户端连接加参数--bind_ip_all 导入单个collection ./mongorestore -v -h ip -u xxxx -p xxxx –db=blogs -c blogs /home/yuedun/download/xxxx.bson/xxxx/blogs.bson 或导入整个目录 ./mongorestore -v -h ip -u xxxx -p xxxx –db=blogs –drop /home/yuedun/download/xxxx.bson/xxxx 没有指定-h参数会报错:Failed: error connecting to db server: no reachable servers 阿里云上-h参数需要内网ip,localhost不行。

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'}}

RockMongo使用方法

月盾
RockMongo是一个PHP5写的MongoDB管理工具。 鉴于百度bce的mongodb数据使用了RockMongo来管理数据,就以此来说明。 查询操作 点击某个collection后的默认画面: 查询界面很简单,关键是怎么写查询语句? 点击文本可以查看所有数据字段,查询title为“测试”文档: array( 'title' => '测试' ) 模糊查询: array( 'title'=> new MongoRegex("/测试/i") ) 字段名要加引号,中间使用=>而不是使用:分割,需要查询的值也需要注意,字符串加引号,数字不加,如果类型不匹配就会查不出数据。查询结果有一条数据 修改操作 动作中选择“modify” 再查询一下 基本操作就是这样,删除操作不用说也应该能知道怎么做了。