如何将DB行合并到文档中?

时间:2014-12-16 17:16:26

标签: mongodb ravendb database nosql

这个问题的设置有点复杂,请耐心等待:)

我的方案是将数据从关系表格式迁移到文档集合格式(“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"
      }
   ]
}

我的问题是:将表格行合并到文档中的最佳方法是什么?

采用支持部分更新(MongoDBRavenDB)的文档存储并使用该功能的最佳方法是什么?

或许我应该从文档数据库中获取整个文档,在我的业务逻辑层更新它并将其全部保存回数据库?

或者我应该完全针对数据的不同文档表示?

2 个答案:

答案 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

∥焦