我在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
我正在寻找一种优雅的方式来解决这个问题。有没有办法在数据库中查询已经使用的鉴别器?
答案 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()
当您需要在不同时间重用鉴别器时,这可能很有用,并且其名称以某种方式与您的数据相关联。