此篇用于备忘, 最近要拆分数据库, 但是保留用户部分共享, 因此会用到一个项目的代码连接多个数据库的情况, 以前用的是
mongoose.connect()
用这个建立的数据库连接, 只能连接一个数据库, 要想同时连接多个, 需要用下面这个:
mongoose.createConnection()
就现在项目的逻辑来说, demo大致如下:
//首先创建两个数据库连接 var mongoose = require('mongoose'); var config = require('config'); var conn1 = mongoose.createConnection(config.db1); var conn2 = mongoose.createConnection(config.db2);
创建模型测试:
//创建两个用户模型 var Schema = mongoose.schema; var UserSchema1 = new Schema({ nickname: String, age: Number, email: String, }); var UserSchema2 = new Schema({ nickname: String, age: Number, email: String, }); //再来, 我们创建两个不同连接的module, var User1 = conn1.model('User', UserSchema1); var User2 = conn2.model('User', UserSchema2); //接下来, 写两个测试函数看看结果: function save1() { new User1({ nickname: 'one', age: 8, email: 'qiaoker@hello.com', }).save(function (err, user) { if (err) { console.error(err.toString()); } else { console.log('===== user1 ========'); console.log(user); } }); } function save2() { new User2({ nickname: 'two', age: 3, }).save(function (err, user) { if (err) { console.error(err.toString()); } else { console.log('===== user2 ========'); console.log(user); } }); }
经测试, 两个函数分别生成了各自的数据库和集合, 实现了业务需要, 即使用指定数据库中的模型, 唯一要注意的是在使用不同的数据库的模型时, 要知道自己在用哪个连接, 连接对象的名字要起得清晰.
最后补充一个最近总要用到的array类型字段的筛选方法: elemMatch方法, 这个方法mongoose官方文档写的很省略.. 基本上没明白是干嘛用的, 无奈我去看了mongodb的对应方法, 才知道原来是筛选符合条件的array字段的doc用的, 大概的用法如下
Model.where('friends').elemMatch({sb: '2b'}).execFind(callback); // 上面的查询语句可以筛选出friends这个数组字段中拥有{2b: '2b'}这个元素的所有的doc.