【问题标题】:When create two objects referring to each other at the same time, why the first's ObjectId is changed after stored into MongoDB?当同时创建两个相互引用的对象时,为什么存储到MongoDB后第一个Object Id会改变?
【发布时间】:2011-11-28 05:04:38
【问题描述】:

我正在使用 spring roo,但我认为这不是 spring roo 问题,而是 MongoDB 问题。

我有两个相互引用的类(文档)。

public class Dummy {
    private String dummyString;

    @DBRef
    private Dummy2 dummy2;
}

public class Dummy2 {
    private String dummyString;
    private ObjectId dummyId;
}

“Dummy”通过引用引用“Dummy2”。
由于技术原因,'Dummy2' 是通过手动存储 ObjectId 来指代'Dummy'。

这是我创建两个对象的集成测试。

@Test
public void testDummyWithDummy2() {
    DummyDataOnDemand dod = new DummyDataOnDemand();
    Dummy dummy = dod.getNewTransientDummy(0);
    dummyService.saveDummy(dummy);

    Dummy2DataOnDemand dod2 = new Dummy2DataOnDemand();
    Dummy2 dummy2 = dod2.getNewTransientDummy2(0);
    dummy2.setDummyId(dummy.getId());
    dummy2Service.saveDummy2(dummy2);

    dummy.setDummy2(dummy2);
    dummyService.updateDummy(dummy);
}

我发现结果不一致。
目前有两种情况。

  1. 它工作正常。它们按预期相互引用。

    假人:

    {
        "_id": ObjectId("4ecfa5429418d09a94f1c8ae"),
        "_class": "com.mytest.model.Dummy",
        "dummyString": "dummyString_0",
        "dummy2": {
            "$ref": "dummy2",
            "$id": ObjectId("4ecfa5429418d09a94f1c8af") 
        } 
    }
    


    假人2:

    {
        "_id": ObjectId("4ecfa5429418d09a94f1c8af"),
        "_class": "com.mytest.model.Dummy2",
        "dummyString": "dummyString_0",
        "dummyId": ObjectId("4ecfa5429418d09a94f1c8ae") 
    }
    
  2. 有时,dummy 指的是空,而 dummy2 指的是无效的 ObjectId。

    假人:

    {
        "_id": ObjectId("4ecfa039941836a18fe88b24"),
        "_class": "com.mytest.model.Dummy",
        "dummyString": "dummyString_2147483647" 
    }
    


    假人2:

    {
        "_id": ObjectId("4ecfa039941836a18fe88b23"),
        "_class": "com.mytest.model.Dummy2",
        "dummyString": "dummyString_0",
        "dummyId": ObjectId("4ecfa039941836a18fe88b22") 
    }
    

我想知道为什么会发生后一种结果。看起来 Dummy 与 Dummy2 所指的 Dummy 不一样,看起来像新创建的 Dummy。但是带有 ObjectId("4ecfa039941836a18fe88b22") 的 Dummy 在哪里?它丢失了吗?为什么?

Roo:1.2.0.M1 [rev 1fa252f]
MongoDB:2.0.1

【问题讨论】:

    标签: mongodb spring-roo mongodb-java nosql


    【解决方案1】:

    你是如何注意到坏对象的?是通过事后查询集合吗? 还有,你是怎么插入对象的,有没有做大批量操作?

    重要的是要理解默认情况下使用 mongodb 的写入是不被确认的。 可能存在错误(复制键,或只是套接字缓冲),您的应用程序不会得到异常或延迟。 确保使用 SAFE 写入(使用 WriteConcern),然后再次测试并注意任何异常。

    【讨论】:

    • 我用RockMongo看采集结果。关于插入,它只是问题中的 testDummyWithDummy2() 。只有 3 个查询命令。我担心文档和 ObjectId 在真正更新到服务器之前完全在客户端处理。但是,dup 键是不可能的,因为在隔离环境中只执行了 3 个命令。套接字缓冲问题也不太可能发生,因为它是在 localhost 上完成的。如您所述,我将尝试安全写入。我也会做一些实验,看看是Spring-Roo,MongoDB驱动,还是MongoDB本身。
    • 我发现集成测试是我自己的错。我已经发布了我自己问题的另一个答案。无论如何谢谢你:-)
    【解决方案2】:

    在做了更多测试并查阅了 MongoDB 日志之后。我发现这是因为 Spring Roo 生成的集成测试包括一些让随机文档进行处理的测试。这就是为什么我的集成测试结果不一致的原因。

    所以我会将我自己的测试与 Roo 生成的测试分开,以在 MongoDB 上保留预期的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 2013-10-13
      • 1970-01-01
      相关资源
      最近更新 更多