【问题标题】:MongoDB (or Morphia) conditional referenceMongoDB(或 Morphia)条件引用
【发布时间】:2018-08-22 21:24:05
【问题描述】:

我有一个 MongoDB 集合 C,其架构包含对另一个集合 D 的手动引用,我使用 Java 中的 Morphia 来管理 C 和 D。D 在其架构中有一个布尔字段 b,我想验证我对 b 的引用(即,当将新文档 c 写入集合 C 时,如果它的引用指向 D 集合中的某个实体 d,那么如果 d 的布尔值 b 为假,那么 MongoDB 应该抛出错误)。

为了更具体地描述,假设您有 2 个标准 POJO 来表示 MongoDB 集合模式:

class C {
    @Id
    public String id;

    @Reference
    public D target; 
}

class D {
    @Id
    public String id;

    public boolean b;
}

基于此架构,示例插入操作将如下所示 (JSON):

{
    "target" : { "id": "MY_FANCY_ID" }
    //There is a record with id = "MY_FANCY_ID" in collection D
}

在插入带有非空目标(D)的新C时,我想检查target.b是否为false,如果是,则抛出数据库错误。

1) 有没有办法在 MongoDB 中本地执行此操作?
2) 如果不是 1),那么有没有办法在 Morphia 中进行管理(没有一些极其迟钝和冗长的 hack)?

谢谢!

【问题讨论】:

  • 也许你应该在 C.setTarget() 中添加验证
  • 问题是我希望C尽可能地成为POJO,我不想在我的POJO中注入Datastore。

标签: java mongodb morphia


【解决方案1】:

对于 MongoDB,您很不走运。使用 Morphia,您可以使用 @PerPersist 之类的东西来执行额外的查询以检查该布尔值。这意味着每次保存 C 时都会进行额外的查询,除非您设计一些快捷方式以仅在初始插入时执行查询。检查 ID 是否为空可能会有所帮助。

【讨论】:

  • 谢谢埃文!很高兴听到 Morphia 自己的首席开发人员 :) 不幸的是,检查 ID 是否为空在这里还不够好;在这种情况下,null 实际上是一个有效的 D(引用可以为空)。但很高兴知道我没有找到简单的解决方法。
  • 另外,如果你不介意的话,如果你能看一下这个已经解决了大约一周左右的其他问题,我将不胜感激:stackoverflow.com/questions/51884690/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多