【问题标题】:Deep clone a MongoDb document with embedded documents ID's (tree structure)深度克隆带有嵌入文档 ID(树结构)的 MongoDb 文档
【发布时间】:2021-05-24 19:34:18
【问题描述】:

我正在努力寻找基于深度克隆具有嵌入式文档 ID 的给定文档的解决方案,但这些嵌入式文档可能还具有其他嵌入式文档 ID。我想在它们所属的特定集合中创建这些嵌入文档的副本,并构建具有对这些新添加文档的引用的父(根)文档。所以例如我有这个架构:

1.页面

{ 
"_id" : 123456789, 
"page_title" : "Title 1",
"sections" : [111, 222, ...]
"variables" : [v1, v2, ...]
}

2。部分

{ 
"_id" : 111, 
"section_tag" : "Section 1",
"sections" : [333, ...]
"blocks" : [1212, 2323, ...]
}

3.块

{ 
"_id" : 1212, 
"block_type" : "paragraph" (or image etc.),
"content" : "<p> content goes here...</p>"
"conditions" : [condition_id_1, condition_id_2, ...] (these are also embedded documents)
}

首先我必须克隆名为“page”的文档,然后继续克隆该文档的“sections”属性。但是对于每个“部分”文档,我们还有其他嵌入文档等等。

这个问题有什么解决办法吗?我担心在 NoSQL 数据库中,让树模型结构和集合与其他人有关系并不是一个好主意,这会使查询和存储数据变得更糟。我也知道嵌入整个文档,不仅是它引用的文档的 ID,而且 MongoDb 中的文档大小有一个限制,即 16mb,这不是我努力的目标。

感谢您到此为止,希望您已理解问题描述。我也为我糟糕的英语道歉。

----已编辑 因此,在克隆文档后,即在页面集合中,数据库应如下所示:

1.页面集合

{ 
"_id" : 4567890, 
"page_title" : "Title 1",
"sections" : [444, 555, ...]
"variables" : [v3, v4, ...]
}

2。 section 集合(注意此文档如何引用同一集合的其他文档)

{ 
"_id" : 444, 
"section_tag" : "Section 1",
"sections" : [666, ...]
"blocks" : [3434, 4545, ...]
}

3.块

{ 
"_id" : 3434, 
"block_type" : "paragraph" (or image etc.),
"content" : "<p> content goes here...</p>"
"conditions" : [condition_id_3, condition_id_4, ...] (these are also embedded documents ID's)
}

【问题讨论】:

  • 您可以使用JsonConvert进行序列化和反序列化以创建对象与其他子对象的副本。
  • @Jawad 对不起,序列化和反序列化与在 mongodb 中深度克隆文档有什么关系?我没有使用 json。
  • 所有mongodb文档都是json文档。您可以在 C# 中正常序列化和反序列化对象以创建“深度克隆”。
  • @floralb BsonDocument 类有一个 DeepClone 方法。试过检查吗? mongodb.github.io/mongo-csharp-driver/2.3/apidocs/html/…
  • 是 @EnricoMassone 我已经检查过该方法,但它不会根据不同的集合进行克隆,它只会复制 Bson 元素,例如名为“sections”的属性“页面”文档将被复制为具有相同文档 ID 值的数组。

标签: c# .net mongodb mongodb-query mongodb-.net-driver


【解决方案1】:

如果您正在谈论深度克隆 c# poco,您可以使用以下扩展方法:

public static class Extensions
{
    public static T Duplicate<T>(this T source)
    {
        return BsonSerializer.Deserialize<Container<T>>(
            new Container<T> { Data = source }.ToBson()
            ).Data;
    }

    private class Container<T>
    {
        public T Data { get; set; }
    }
}

你可以像这样使用它:

Page copy = page.Duplicate();

您将需要以下导入:

using MongoDB.Bson;
using MongoDB.Bson.Serialization;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2018-01-19
    相关资源
    最近更新 更多