这个问题的设置有点复杂,请耐心等待:)
我的方案是将数据从关系表格式迁移到文档集合格式(“ETL”)。我的源数据在关系表中表示,其中每行描述“人”和他/她的“地址”之一。 (当然这个表没有标准化。)
一个简化的例子是:
PersonId PersonName AddressId AddressText
1 John Doe 1 Somewhere
1 John Doe 2 Elsewhere
2 Jane Doe 3 Some other place
为了使事情复杂化,某些行可以更新以前的现有值。例如:
PersonId PersonName AddressId AddressText
1 John Doe 1 A new address
我想将此数据迁移到文档存储(DB)中的文档集合中,以便轻松检索具有所有相关地址的特定Person实体。首先,我正在考虑每个人的单个文档,如下所示:
{
"id":"1",
"addresses":[
{
"id":"1",
"text":"A new address"
},
{
"id":"2",
"text":"Elsewhere"
}
]
}
我的问题是:将表格行合并到文档中的最佳方法是什么?
采用支持部分更新(MongoDB,RavenDB)的文档存储并使用该功能的最佳方法是什么?
或许我应该从文档数据库中获取整个文档,在我的业务逻辑层更新它并将其全部保存回数据库?
或者我应该完全针对数据的不同文档表示?
答案 0 :(得分:1)
您的文档在MongoDB中看起来像这样:
{
person_id:PersonId,
name: PersonName,
addresses:[{
id:AddressId1,
street:AddressText1
},
{
id:AddressId2,
street:AddressText2
},
...
{
id:AddressIdn,
street:AddressTextn
}]
}
然后,我们可以通过这种方式更新第二个地址:
db.collection.update({person_id:PersonId,"addresses.id":AddressId2},{$set:{"addresses.$.street":NewAddress}})
有关其他详细信息,请参阅此处:http://docs.mongodb.org/manual/reference/operator/update/positional/#update-embedded-documents-using-multiple-field-matches
希望这会有所帮助。
答案 1 :(得分:1)
您可能想问问自己为什么要进行"部分更新"在一份文件上。如果要求您应该能够更改/更新某个人的地址,您可能希望在Person实体中对该行为进行建模(您使用&#34表达的内容;在我的业务逻辑层中更新它&# 34。)
更改地址信息似乎是域责任,应该(imo)相应地建模。在C#中使用RavenDb的简单示例:
using (var session = _documentStore.OpenSession())
{
var person = session.Load<Person>("persons/1");
person.UpdateAddressInformation(someAddressInformation);
session.SaveChanges();
}
但如果你真的需要进行部分文档更新,你也可以使用RavenDb:
http://ravendb.net/docs/article-page/2.5/csharp/client-api/partial-document-updates
∥焦