如何在DocumentDB中删除文档下的特定对象?

时间:2016-11-28 07:29:51

标签: asp.net-mvc-5 azure-cosmosdb nosql

我使用documentDB作为项目的后端。 我创建了一个名为ResellerCollection的集合。 在它下面,我添加了文档作为经销商,其中ID分配给它。 现在,在Reseller文档下,我添加了一个Customer列表,现在我想按特定ID删除经销商文档的客户。

在documentDB中生成的我的JSON如下。

{
"id": "73386791-5895-4a56-9108-df4a773331fe",
"Name": "Nadeem",
"PrimaryContact": "1234",
"Address": "bhusari clny",
"City": "pune",
"State": "maharashtra",
"Country": "india",
"ZipCode": "222",
"Telephone": "45234343",
"Email": "abc@xyz.com",
"Website": "asdfsd.com",
"Customer": [
  {
    "id": "4acf3ca9-f9e4-4117-a471-7ce8f905baec",
    "FullName": "Test Cust1",
    "Company": "safds",
    "JobTitle": "sadf",
    "Email": "abcd@xyz.com",
    "Address": "asdfsaf",
    "City": "sdf",
    "State": "sdf",
    "Country": "sadf",
    "ZipCode": "2343",
    "Telephone": "45234343",
    "MerchantID": "232",
    "IdentificationNo": "2342343",
    "IsActive": true,
    "CustomerGroupID": "34",
    "ResellerID": "73386791-5895-4a56-9108-df4a773331fe"
  },
  {
    "id": "e0d6d099-3d5d-4776-9b84-14b7ae0b9911",
    "FullName": "Test Cust2",
    "Company": "safds",
    "JobTitle": "sadf",
    "Email": "abcd@xyz.com",
    "Address": "asdfsaf",
    "City": "sdf",
    "State": "sdf",
    "Country": "sadf",
    "ZipCode": "2343",
    "Telephone": "sadf",
    "MerchantID": "232",
    "IdentificationNo": "2342343",
    "IsActive": true,
    "CustomerGroupID": "34",
    "ResellerID": "73386791-5895-4a56-9108-df4a773331fe"
  }
],
  "UserId": "f807f027-2e21-45b1-b786-e4d2b3d677cb",
  "_rid": "+JBQAOQWHQENAAAAAAAAAA==",
  "_self": "dbs/+JBQAA==/colls/+JBQAOQWHQE=/docs/+JBQAOQWHQENAAAAAAAAAA==/",
  "_etag": "\"0a004764-0000-0000-0000-583bd8b50000\"",
  "_attachments": "attachments/",
  "_ts": 1480317104
}

请建议我如何在MVC中为客户编写删除功能。我是否应该删除删除特定客户的删除或是否必须更新整个客户列表?

2 个答案:

答案 0 :(得分:1)

删除数组元素(或对文档的任何其他更改)的唯一方法是获取整个文档,修改它,然后创建/插入整个文档。您可以在客户端或存储过程中执行此操作。

尽量不要将集合视为传统数据库中的表或MongoDB中的集合。我曾经说过,把它们想象成"分区"但是对于分区集合,即使这种区别也没有用。我现在使用单个分区集合。我通过在每个文档中包含一个元素来区分文档类型:isReseller = trueisCustomer = true作为示例。或者,您可以type = 'Reseller'type = 'Customer'。但是,如果一个经销商的客户自己是经销商,前者将允许您添加is___ = true,后者则不会。

David Makogon所说的绝对是一种担忧。除非经销商仅限于少数客户,否则最好将它们单独存储并使用外键链接它们。这样,删除或添加一个是一步。但是,获得经销商及其所有客户将是两次往返。

答案 1 :(得分:1)

两种方法。

  • 在DocumentDB中实现“AddCustomer”和“RemoveCustomer”存储过程。这些存储过程将读取经销商文档,然后追加或删除作为参数传入的新客户。然后在控制器中调用ExecuteStoredProcedureAsync。
  • 而不是存储过程方法,在控制器中执行三个步骤。阅读文档,进行更改并替换文档。

在这两种实现中,您可能都希望使用ETag执行条件写入,以避免跨多个客户端/编写者的任何破坏。

正如Larry和David指出的那样,您还应该考虑不同的JSON建模选项,例如将客户数据存储为单独的文档,或者仅存储阵列中的ID与所有相关的客户数据。