【发布时间】: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