【问题标题】:Embedded root object stored with wrong id使用错误 ID 存储的嵌入式根对象
【发布时间】:2018-07-30 11:54:51
【问题描述】:

我有一个名为 Session 的对象,其中另一个名为 User 的根对象被声明为所有者。在 MongoDB 中,所有者字段被索引为唯一: 在 Session>>ofUser 中:我发送以下消息:

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 对象的 owner.__id 与 ASUser Id 不同?

总结一下:

  • 第一次执行,当没有特定用户的Session对象时,执行ifNil: Block,创建拥有者为ASUser的Session对象并保存到MongoDB中
  • 所有者 __id 与 ASUser 的 OID 不同。
  • 第二次执行 selectOne: 块仍然没有找到特定用户的 Session 对象。
  • 所以要么“自我新建,保存块”是错误的,要么我有一个错误的选择查询。

【问题讨论】:

  • 感谢您提供详细信息。你能做一个Transcript show:anASUser voyageId(each at: 'owner.__id')。当你第二次运行它? + ASUser 收藏的内容?当你做(each at: 'owner.name') = 'zack'时它工作正常吗?
  • 如下所述,该方法是在不同的数据库中创建新的 ASUser。 (ASUser 在 DB A 中,Session 在 DB B 中)。查看答案
  • 我有这种感觉。这就是为什么我问owner.name = 'zak'。很高兴你能解决它。

标签: mongodb smalltalk pharo


【解决方案1】:

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

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

这种情况正在发生,尽管 ASUser 类的 ASUser>>voyageRepository 返回了正确的数据库。

【讨论】:

    猜你喜欢
    • 2021-07-06
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2014-07-25
    • 2010-10-12
    相关资源
    最近更新 更多