代码之家  ›  专栏  ›  技术社区  ›  maxbareis

使用错误的ID存储的嵌入根对象

  •  0
  • maxbareis  · 技术社区  · 6 年前

    我有一个名为session的对象,其中另一个名为user的根对象声明为owner。在MongoDB中,所有者字段被索引为唯一的: 在用户会话中:我发送以下消息:

    ofUser: anASUser
        ^ (self selectOne: [ :each |
            (each at: 'owner.__id') = anASUser voyageId ])
        ifNil: [ self new
            owner: anASUser;
            save ]
    

    这是用户数据库中的用户:

    {"_id":"5b5e006643d001c78f2e88d6",
        "#instanceOf":"ASUser",
        "#version":"-551686239533400057",
        "name":"zack"}
    

    这是调试器中Asuser的Self-VoyageID的值:

    OID(5B5E006643D001C78F2E88D6)
    

    这是从ofuser方法保存的akmsession对象:

    {"_id":"5b5ef4350f2532682e2e9536",
        "#instanceOf":"AKMSession",
        "#version":"-928582753905278919",
        "action":null,
        "owner":
           {"collection":"ASUser",
               "#instanceOf":"ASUser",
               "__id":"5b5ecf7a0f2532d63a2e952f"},
           "recipe":null}
    

    为什么akmsession对象的所有者.uuu id与asuser id不同?

    总结一下:

    • 第一次执行时,当特定用户没有会话对象时,执行ifnil:block,创建以as user为所有者的会话对象并保存到mongodb中。
    • 所有者ID与Asuser的OID不同。
    • 第二次执行时,selectone:block仍然找不到具有特定用户的会话对象。
    • 所以“self new,save block”是错误的,或者我有一个错误的select查询。
    1 回复  |  直到 6 年前
        1
  •  0
  •   maxbareis    6 年前

    好吧,这是我的错。我混合了MongoDBS,并且该方法在错误的数据库中永久地创建了一个不同的集合(没有索引,所以它总是可以创建一个新条目)。

    因此,如果您为用户访问一个数据库,并将嵌入用户的对象存储在另一个数据库中,请注意,这可能会发生。

    尽管Asuser类具有Asuser>>Voyagerepository返回正确的DB,但仍会发生这种情况。