Mongoose - 如何找到已经在使用的鉴别器

Mongoose - how to find discriminators already in use

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

我的一般方法是在 API 启动时为两个连接创建所有模型。即使 read/write 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 

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

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

ReadUser.discriminators 

WriteUser.discriminators 

然而,这对我来说 return 没有任何意义。什么工作正在使用

Object.keys(Model.discriminators)

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

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

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

ReadSpecialUserDocument.save()

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