我正在学习Morphia / MongoDB,我对有序实体有疑问。我找不到关于这个主题的现有问题,我没有多少运气。
为了这个问题,我有三个实体:Job
,JobStatus
和JobPriority
。
JobStatus和JobPriority实例由用户即时定义。这些实体是各个Job实体将引用的全局值。 JobStatus和JobPriority都需要可订购,并且需要保存该订单。
本能地,我开始通过以下设置来解决这个问题(为了方便阅读而减少了):
首先:有序实体
@Embedded
abstract class OrderedEntity {
@Indexed(value=IndexDirection.ASC, name="order_ndx", unique=true)
Integer oderNdx;
}
@Embedded
class JobStatus extends OrderedEntity { ... }
@Embedded
class JobPriority extends OrderedEntity { ... }
第二:管理排序顺序的父实体
@Entity
abstract class OrderedEntityList<T extends OrderedEntity> {
@Embedded
List<T> entities;
}
@Entity
class JobStatusList extends OrderedEntityList<JobStatus> { ... }
@Entity
class JobPriorityList extends OrderedEntityList<JobPriority> { ... }
第三名:工作
@Entity {
@Reference
JobStatus status;
@Reference
JobPriority priority;
}
我的计划是在启动时创建JobStatusList和JobPriorityList的实例,然后在UI中使用一个表单,让用户插入嵌入的Status / Priority实例并定义顺序。
我确信这是错误的做法,并希望在我挖得太深之前得到一些意见。
如果我正确理解了Morphia注释,Job实体可以@Reference
JobStatus
或JobPriority
值,因为@Embedded
实体无法提供参考-able ID。
修改
根据评论和答案,需要澄清这个问题。
我正在创建一个通用的作业跟踪框架,可以在运行时进行调整以适应各种商业模式。
JobStatus
表示每个作业的用户定义状态。最终,我希望能够做一些事情,例如查询所有&#39;已完成&#39; job,所以我想维护一个JobStatus
条目的全局列表,可以由用户生成和订购以满足他们的需求。
在任何时候,Job
仅引用单个JobStatus
,但在更新Job
的状态时,我希望能够在工作流程中选择下一个状态从可预测的,用户定义的值列表中排序。
JobPriority
的相似之处在于我希望它是有序的用户定义值的全局列表,但在大多数情况下,Job只会引用一个优先级。
同样,我希望能够查询像所有&#39; EXPEDITED&#39;作业。
我知道只要保存单个实体并在移动现有列表条目时更新所有JobStatus和/或JobPriority上的orderNdx
字段,我就可以在没有列表的情况下实现此目的,但我希望能够做到所以以一种保证orderNdx
中唯一价值的方式。
答案 0 :(得分:0)
Morphia允许您在List中定义嵌入的类以保持顺序。所以你有一个非常简单的解决方案应该适合你:
@Embedded
class JobStatus {
...
}
@Embedded
class JobPriority {
...
}
@Entity
class Job {
@Embedded
List<JobStatus> statuses = new ArrayList<JobStatus>();
@Embedded
List<JobPriority> priorities = new ArrayList<JobPriority>();
...
}
这样可以跳过Mongo中不必要的集合并将嵌入式作业与作业保持在一起,这样就可以避免多次往返数据库,从而减少延迟。