【问题标题】:Different keys on two collections of same document for Document Versioning Pattern文档版本控制模式的同一文档的两个集合上的不同键
【发布时间】:2021-05-28 16:16:59
【问题描述】:

我有一个需要跟踪文档历史记录的 C# 应用程序,所以我想实现 Document Versioning Pattern。但是我不知道如何在 hist 集合上执行 _id。

假设我的文档如下所示:

{
  _id : "abc",
  rev : 3, 
  loc : "root"
  dat : {
    ..
  }
}

我尝试的是两个集合,live 和 hist。但是如何将 hist 表上的 _id 设置为 { _id, rev } 或生成的 ObjectId?否则尝试将“abc”的下一个 rev 插入 hist 会导致重复键错误。

c# 类上的属性不起作用,因为这会导致两个集合上的 _id 相同。

我也想过将它们放入一个集合中,但如果我需要所有具有 loc=root 的活动文档,这会使查询变得相当复杂。

我有点难过,文章没有提到这个明显的问题。

【问题讨论】:

    标签: c# mongodb


    【解决方案1】:

    您不要在历史收集中使用 _id 作为 _id。每个历史文档都可以有自己唯一的_id

    历史

    {
      _id: 'own id',  //unique
      ref: '_id of live',
      rev: 3,
      changes: '...'
    
    }
    

    【讨论】:

    • 这确实是一个解决方案,但是当我有 1 个 C# 类时,我该如何具体说明?
    • 抱歉,我想知道您所说的 1 个 C# 类是什么意思。这和.Net有关?
    • 我的应用程序是用 C# 编写的(但我认为可以是任何 OO 语言),因此集合的架构来自该类。我可以在该类上设置 [BsonId] ,但这会将相同的字段设置为 live 和 hist 集合上的 key。我也没有在 CreateCollectionOptions 中看到选项。
    • 因为这是标签 mongodb,我不能建议你使用 C#。但是,在 mongo 中,如果您更新的文档是例如。 abc,我们可以用 db.collection.updateOne({ ref: 'abc', rev: 3}, { upsert: true }) 更新,它将在 hist 集合中创建一个新文档
    • ok 更新了问题以表明 C# thx
    【解决方案2】:

    最后我选择了两个属性:

    _id 
    hid 
    

    当我存储在 History 表中时,我会更新 _id 字段

    hid = _id;
    _id = $"{_id}_{rev}";
    

    当我加载时,我将它们切换回来:

    _id = hid;
    hid = null; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-12
      • 2022-07-26
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      相关资源
      最近更新 更多