2016-11-28 69 views
0

我使用documentDB作为我的项目的后端。 我已经创建了一个名为ResellerCollection的集合。 在它之下,我将文档添加为ID分配给它的经销商。 现在,在经销商文档下,我添加了客户列表,现在我想通过特定的Id删除经销商文档的客户。如何删除DocumentDB文档中的特定对象?

我在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": "[email protected]", 
"Website": "asdfsd.com", 
"Customer": [ 
    { 
    "id": "4acf3ca9-f9e4-4117-a471-7ce8f905baec", 
    "FullName": "Test Cust1", 
    "Company": "safds", 
    "JobTitle": "sadf", 
    "Email": "[email protected]", 
    "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": "[email protected]", 
    "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中为客户编写删除函数。是否应该删除它以删除特定客户或是否必须更新整个客户列表?

+1

与你的问题没有什么关系,但是......你应该知道你的数据模型中有一个*无限数组条件(在你的经销商文档中存储可能无限数量的客户)。这是因为你存储了关于每个客户的全部信息,比如只是一个客户ID。 –

+0

谢谢大卫,Larry和Aravind的建议,这对我很有帮助。 –

回答

1

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

尽量不要将集合看作传统数据库中的表或MongoDB中的集合。我曾经说过,把它们看作“分区”,但是使用分区集合,即使这种区分也没有用。我现在使用一个单独的分区集合。我通过在每个文档中包含一个元素来区分文档类型:例如,您可以使用isReseller = trueisCustomer = true。或者,您可以执行type = 'Reseller'type = 'Customer'。但是,如果一个经销商的客户本身是经销商,前者将允许您添加is___ = true,而后者不会。

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

1

这样做的两种方法。

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

在这两种实现中,您可能都希望使用ETag执行条件写入以避免跨多个客户端/作者的任何破坏。 Larry和David指出,您还应该考虑不同的JSON建模选项,例如将客户数据存储为单独的文档,或者只存储阵列中的ID与所有相关的客户数据。

相关问题