【问题标题】:Mongoose - how to find discriminators already in useMongoose - 如何找到已经在使用的鉴别器
【发布时间】:2017-12-15 23:47:16
【问题描述】:

我在 REST API 中使用 MongoDB 和 Mongoose。一些部署需要一个副本集,因此需要单独的读/写数据库,因此我在 API 中有单独的读/写连接。然而,更简单的部署不需要副本集,在这些情况下,我将我的读/写连接指向同一个 MongoDB 实例和数据库。

我的一般方法是在 API 启动时为两个连接创建所有模型。即使读/写 conns 连接到同一个数据库,我也可以在两个连接上创建相同的模型而不会出错。

let ReadUser = dbRead.model('User', userSchema);
let WriteUser = dbWrite.model('User', userSchema);
// no error even when dbRead and dbWrite point to same DB

在我开始使用 Mongoose 鉴别器之前,问题就来了。

let ReadSpecialUser = ReadUser.discriminator('SpecialUser', specialUserSchema);
let WriteSpecialUser = WriteUser.discriminator('SpecialUser', specialUserSchema);

// Results in this Error when read and write point to same DB:
// Error: Discriminator with name "SpecialUser" already exists 

我正在寻找一种优雅的方式来处理这个问题。有没有办法在数据库中查询已经在使用的鉴别器?

【问题讨论】:

    标签: node.js mongodb mongoose discriminator


    【解决方案1】:

    根据Mongoose API docs 的方法是使用Model.discriminators。所以在上面的情况下它会是

    ReadUser.discriminators 
    

    WriteUser.discriminators 
    

    但是,这对我没有任何回报。什么工作正在使用

    Object.keys(Model.discriminators)
    

    正如预期的那样,这将为您提供一个包含您之前设置的鉴别器名称的字符串数组。

    如果您想使用现有的鉴别器模型并知道其名称,您可以使用 Model.discriminators.discriminatorName。在您的示例中,它将是:

    let ReadSpecialUserDocument = new ReadUser.discriminators.SpecialUser({
      key: value,
      key: value,
    });
    
    ReadSpecialUserDocument.save()
    

    当您需要在不同时间重复使用鉴别器时,这会很有用,并且它的名称以某种方式与您的数据相关联。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 2017-02-12
      相关资源
      最近更新 更多