在Morphia / MongoDB中存储有序实体

时间:2014-07-02 23:38:19

标签: java mongodb morphia

我正在学习Morphia / MongoDB,我对有序实体有疑问。我找不到关于这个主题的现有问题,我没有多少运气。

为了这个问题,我有三个实体:JobJobStatusJobPriority

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 JobStatusJobPriority值,因为@Embedded实体无法提供参考-able ID。


修改

根据评论和答案,需要澄清这个问题。

我正在创建一个通用的作业跟踪框架,可以在运行时进行调整以适应各种商业模式。

JobStatus表示每个作业的用户定义状态。最终,我希望能够做一些事情,例如查询所有&#39;已完成&#39; job,所以我想维护一个JobStatus条目的全局列表,可以由用户生成和订购以满足他们的需求。

在任何时候,Job仅引用单个JobStatus,但在更新Job的状态时,我希望能够在工作流程中选择下一个状态从可预测的,用户定义的值列表中排序。

JobPriority的相似之处在于我希望它是有序的用户定义值的全局列表,但在大多数情况下,Job只会引用一个优先级。

同样,我希望能够查询像所有&#39; EXPEDITED&#39;作业。

我知道只要保存单个实体并在移动现有列表条目时更新所有JobStatus和/或JobPriority上的orderNdx字段,我就可以在没有列表的情况下实现此目的,但我希望能够做到所以以一种保证orderNdx中唯一价值的方式。

1 个答案:

答案 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中不必要的集合并将嵌入式作业与作业保持在一起,这样就可以避免多次往返数据库,从而减少延迟。