如何在 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 - 一个实体如何引用多对多关系中涉及的两个其他实体?

如何在 MongoDB 中建模关系? [复制]

xml中的实体引用

MongoDB:匹配字符串字段中的多个值

CoreData + mogenerator - 如何防止中间数据模型中的`setValue(forKey :)`引用最终数据模型中实体的'人类'类?