【问题标题】:Connecting Multiple database in the predefined Mongoose structure在预定义的 Mongoose 结构中连接多个数据库
【发布时间】:2018-08-14 19:09:16
【问题描述】:

首先,我给大家介绍一下我们的项目:

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

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

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

  1. merchant_id 到数据库名称。 (哪个商家被分配了哪个db,因为每个商家应该有单独的db)

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

我们希望每个商家在登录时只能看到自己数据库中的数据。

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

我们希望每个在我们的门户网站上注册的商家都有一个单独的数据库。 (因为每个商家都有很多交易)。我们已经在mongoose ORM的帮助下定义了所有的函数,例如计算和所有的逻辑部分。由于我们已经定义了一个全局 db.js,然后在模型、模式和路由的帮助下,我们正在使用 mongoose 与数据库的连接请求。

以下是我们的问题:

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

  2. 我们希望在每个商家注册后为每个商家创建一个新数据库,基于某个键(如 IDCardNo)创建一个新的单独数据库,然后动态定义所有计算和逻辑部分它与该特定数据库一起执行。

有一件事是我们使用 mongo-client 而不是 mongoose 来创建一个新数据库,但是因为我们想让所有主数据库计算和逻辑部分(之前编写的)动态操作而被卡住了。我们的问题是:我们如何定义多个数据库连接请求到那个 db.js 文件,它本质上是静态的,而且我们所有的逻辑和计算部分都是基于那个猫鼬连接而不是作为一个单独的连接编写的功能?

我刚刚在互联网上找到了一个解决方案,它为每个拥有 mongoose 的用户以及 node_modules 文件夹分别创建不同的文件夹,但我们不能在这里这样做,因为有太多的连接请求会阻碍服务器性能和存储负载会增加。

我找到了另一个解决方案:将 mongoose 更改为 mongo-client。这种解决方案非常昂贵,因为这意味着我们必须重做许多关键代码——类似于重新制作产品。

我希望您帮助我们解决这个问题并构建这个系统。

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

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

    【讨论】:

    • 你有学习这些mongodb Stitch版本的链接吗?因为我没有得到任何链接,而且在这个版本中我也没有得到任何关于上述问题的参考
    【解决方案2】:

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

    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");
    });
    

    【讨论】:

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

    也许您应该为商家和买家定义 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')
    

    我猜这会解决你的问题。

    【讨论】:

    • 为了得到有用的答案,这个反应需要扩展。格式化您的代码示例并解释为什么这是问题的答案。
    • 我们不能对不同的商家和买家使用不同的集合,因为每个商家有2个集合中的数据,每个买家还有8个集合。因此,拥有 1000+ 个集合的数据库是不可行的。
    • 我正在寻找一种方法,通过这种方法,我们可以为每个商家分别划分我们的数据库,其中包含自己的数据和相关的买家数据。
    猜你喜欢
    • 2019-11-29
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2017-08-12
    • 2021-11-25
    • 2022-01-11
    相关资源
    最近更新 更多