猫鼬 - 如何找到已经使用过的歧视者

时间:2017-12-01 21:30:54

标签: node.js mongodb mongoose discriminator

我在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 Discriminators时才出现麻烦。

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 

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

1 个答案:

答案 0 :(得分: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()

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