如何在 MongoDB 中引用其他数据库中的实体? [复制]
Posted
技术标签:
【中文标题】如何在 MongoDB 中引用其他数据库中的实体? [复制]【英文标题】:How to reference entity from other database in MongoDB? [duplicate] 【发布时间】:2018-01-11 15:02:21 【问题描述】:我们正在使用 TypeScript 开发微服务。后端是 MongoDB,我们使用的是 Mongoose。一个微服务处理学校,另一个微服务处理培训。每个微服务都维护自己的数据库。
School Model 需要有基于 trainingID
字段而不是 MongoDB 提供的 _ID
字段的 Training 参考。
我们将此引用定义为纯字符串,这样 Training Collection 中的 trainingID
的值将保存在 School Collection 中,其字段名称与 trainingID
相同。
这是目前为止的代码:
SchoolModel.ts
import Document, Schema, Model, model from "mongoose";
import ISchoolModel from './ISchoolModel';
export const schoolSchema = new Schema(
schoolId: String,
schoolName: String,
trainingId: String
);
export interface ISchool extends ISchoolModel, Document
export const SchoolModel: Model<ISchool> = model<ISchool>("School", schoolSchema);
TrainingModel.ts
import Document, Schema, Model, model from "mongoose";
import ITrainingModel from './ITrainingModel';
export const trainingSchema = new Schema(
trainingId: String,
trainingName: String,
trainingDescription: String
);
export interface ITraining extends ITrainingModel, Document
export const TrainingModel: Model<ITraining> = model<ITraining>("Training", trainingSchema);
问题
这是定义对其他数据库实体的引用的最佳方式吗?
【问题讨论】:
当我想到微服务时,我会想到可以独立且没有其他服务作为依赖项的自包含应用程序。 但是当他们必须的时候,他们只是持有类似 s 主键的东西。除了您描述的方式之外,我看不出还有其他方法可以做到这一点。我猜那些trainingID女孩是不可变的。 【参考方案1】:我会说不太可能。
您在此处对数据建模的方式似乎表明一所学校只能分配一次培训。对我来说,从...开始听起来有点语义错误?
如果这确实是您的意图,您可能希望将所有内容放入同一个文档中,并从您的各个微服务中简单地投影它的不同部分(如果在该设置下它们仍然有意义的话)。
否则,如果一所学校确实可以引用多个培训,则您需要在架构中引用一个培训集合。阅读populate()
,了解如何最好地建立关系模型:
http://mongoosejs.com/docs/populate.html
【讨论】:
感谢大家的回复。 @dnickless - 为了使用 populate() ,我必须通过“ref”定义关系,它将引用“_ID”。我不想那样做。培训可以是多次的。因此,我们可能有一系列培训。但是从学校服务,我们将调用培训服务来验证培训ID 的有效性。另外,我不认为这与另一个问题完全相同。另一个问题是指无法在 Mongoose 中维护 2 个不同的连接。以上是关于如何在 MongoDB 中引用其他数据库中的实体? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
JPA - 一个实体如何引用多对多关系中涉及的两个其他实体?
CoreData + mogenerator - 如何防止中间数据模型中的`setValue(forKey :)`引用最终数据模型中实体的'人类'类?