以预定义的Mongoose结构连接多个数据库

时间:2018-08-07 07:49:47

标签: javascript node.js mongodb mongoose

首先,我将简要介绍一下我们的项目:

我们有一个应用程序,它具有两个用户角色:商人和买方。

一个商人注册并将其贸易信息存储在他的帐户中。 买家还可以登录自己的帐户并在该商人处访问其购买信息。一个买家可以与多个商人打交道。

我们正在考虑一个mongo数据库结构,其中通用mongo数据库只有两个键值对:

  1. merchant_id为数据库名称。 (为哪个商人分配了哪个数据库,因为每个商人应具有单独的数据库)

  2. buyer_id到商家ID。 (例如,买家Ram与两个商家M01和M02有关系)。

我们希望每个商人登录时,他应该只看到其数据库中的数据。

但是,当买家登录时,他应该从与他有业务关系的商家数据库中看到数据。 (Ram应该看到从M01和M02的数据库中提取的数据。)

我们希望为在我们的门户网站上注册的每个商人提供单独的数据库。 (因为每个商人都有很多交易)。我们在猫鼬ORM的帮助下定义了所有功能,例如计算和所有逻辑部分。定义了全局db.js之后,借助模型,模式和路由,我们将Mongoose连接请求与数据库一起使用。

以下是我们的问题:

  1. 当我们的服务器启动时,它连接到db.js文件中定义的数据库,并且存在到全局数据库的连接请求,或者我们称为主数据库。
    我们如何连接多个数据库,而又保持与主数据库的连接? (关闭连接并连接到新数据库会导致我们与主数据库失去连接([拥有所有注册数据],因此不是解决方案。)

  2. 我们希望在每个商人注册后为每个商人创建一个新数据库,根据某个密钥(如IDCardNo)创建一个新的单独数据库,然后动态定义所有计算和逻辑部分对该特定数据库执行的操作。

有一件事是,我们使用mongo-client而不是mongoose来创建新数据库,但是由于我们希望使所有主数据库计算和逻辑部分(之前已编写)能够动态操作而陷入困境。我们的问题是:我们如何为该db.js文件定义一个以上的数据库连接请求,该请求本质上是静态的,而且我们所有的逻辑和计算部分都基于该猫鼬连接而不是单独编写功能?

我刚刚在Internet上找到了一个解决方案,该解决方案为每个拥有猫鼬的用户分别创建了不同的文件夹,并为node_modules文件夹分别创建了一个文件夹,但由于连接请求太多,这会阻碍服务器性能以及存储负载,因此我们无法在此处执行此操作会增加。

我找到了另一个解决方案:将猫鼬更改为mongo-client。该解决方案非常昂贵,因为它意味着我们必须重做许多关键代码,类似于再次生产该产品。

我会要求您帮助我们解决此问题并设计该系统。

3 个答案:

答案 0 :(得分:0)

您可以通过以下方式连接到具有相同模型的多个数据库:

var mongoose = require('mongoose')
var conn = mongoose.createConnection('mongodb://localhost/db1');
var conn2 = mongoose.createConnection('mongodb://localhost/db2');
var Schema = new mongoose.Schema({})
var model1 = conn.model('User', Schema);
var model2 = conn2.model('Item', Schema);
model1.find({}, function() {
   console.log("this will print out last");
});
model2.find({}, function() {
  console.log("this will print out first");
});

答案 1 :(得分:0)

您应该能够使用单个文档和最新的MongoDB Stitch解决此问题,其中我们具有字段级访问控制。.我建议您一次使用Stitch功能

答案 2 :(得分:0)

也许您不必为商人和买方创建2个单独的数据库,而应为商人定义2个猫鼬模式或集合,为买方定义一个。

商人模式

const mongoose = require('mongoose');
const schema = mongoose.Schema;
const merchantSchema = new schema({
 // merchant details
})
mongoose.model('merchant',merchantSchema )

买方模式

const mongoose = require('mongoose');
const schema = mongoose.Schema;
const buyerSchema = new schema({
// merchant will store merchant_id(merchant_id is unique id given 
//   by mongodb for every merchant you save in collection)

 merchant: [{
      type: schema.Types.ObjectId
      ref: 'merchant'
   }]
 // buyer details
})
mongoose.model('buyer',buyerSchema)

正如您提到的,“商家应该只能从他的数据库(这里的集合)中看到数据”。 要将数据显示给特定商人,您可以查询商人模型。 例如:

 merchantSchema.findOne({_id: merchant_id}) 

要向与他有业务关系的商人的用户显示数据,您可以使用

 buyerSchema.findOne({_id: user_id}).populate('merchant')

我想这将解决您的问题。