Asp.net mvc 5 如何在DocumentDB中删除文档下的特定对象?

Asp.net mvc 5 如何在DocumentDB中删除文档下的特定对象?,asp.net-mvc-5,azure-cosmosdb,nosql,Asp.net Mvc 5,Azure Cosmosdb,Nosql,我正在使用documentDB作为我的项目的后端。 我已经创建了一个名为“经销商集合”的集合。 在它下面,我添加了作为分销商的文档,并将Id分配给它。 现在在经销商文档下,我添加了一个客户列表,现在我想按特定Id删除经销商文档中的客户 我在documentDB中生成的JSON如下所示 { "id": "73386791-5895-4a56-9108-df4a773331fe", "Name": "Nadeem", "PrimaryContact": "1234", "Address": "bhu

我正在使用documentDB作为我的项目的后端。 我已经创建了一个名为“经销商集合”的集合。 在它下面,我添加了作为分销商的文档,并将Id分配给它。 现在在经销商文档下,我添加了一个客户列表,现在我想按特定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中为客户编写删除函数。我是应该为其编写delete来删除特定客户,还是必须更新整个客户列表?

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

尽量不要将集合视为传统数据库中的表或MongoDB中的集合。我曾经说过,将它们看作是“分区”,但对于分区集合,即使这种区别也没有用。我现在对所有东西都使用单分区集合。我通过在每个文档中包含一个元素来区分文档类型:
isReseller=true
isCustomer=true
,例如。或者,您可以执行
type='Reseller'
type='Customer'
。但是,如果某个转销商的客户本身就是转销商,则前者将允许您添加两个
is\uu u=true
,而后者则不允许


大卫·马科贡所说的绝对令人担忧。除非经销商仅限于少数客户,否则最好将其单独存储并使用外键链接。这样,删除或添加一个是一个步骤。但是,获得经销商及其所有客户需要两次往返。

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

尽量不要将集合视为传统数据库中的表或MongoDB中的集合。我曾经说过,将它们看作是“分区”,但对于分区集合,即使这种区别也没有用。我现在对所有东西都使用单分区集合。我通过在每个文档中包含一个元素来区分文档类型:
isReseller=true
isCustomer=true
,例如。或者,您可以执行
type='Reseller'
type='Customer'
。但是,如果某个转销商的客户本身就是转销商,则前者将允许您添加两个
is\uu u=true
,而后者则不允许


大卫·马科贡所说的绝对令人担忧。除非经销商仅限于少数客户,否则最好将其单独存储并使用外键链接。这样,删除或添加一个是一个步骤。然而,获得经销商及其所有客户需要两次往返。

两种方法

  • 在DocumentDB中实现“AddCustomer”和“RemoveCustomer”存储过程。这些存储过程将读取转销商文档,然后附加或删除作为参数传入的新客户。然后只需在控制器内调用ExecuteStoreProcedureAsync
  • 在控制器中执行三个步骤,而不是存储过程方法。阅读文档、进行更改并替换文档
在这两种实现中,您可能希望使用ETag执行条件写入,以避免跨多个客户机/写入程序的任何碰撞


正如拉里和戴维指出的,您也应该考虑不同的JSON建模选项,例如将客户数据存储为单独的文档,或者只存储数组中的ID与所有相关的客户数据。p> 有两种方法

  • 在DocumentDB中实现“AddCustomer”和“RemoveCustomer”存储过程。这些存储过程将读取转销商文档,然后附加或删除作为参数传入的新客户。然后只需在控制器内调用ExecuteStoreProcedureAsync
  • 在控制器中执行三个步骤,而不是存储过程方法。阅读文档、进行更改并替换文档
在这两种实现中,您可能希望使用ETag执行条件写入,以避免跨多个客户机/写入程序的任何碰撞


正如拉里和戴维指出的,您也应该考虑不同的JSON建模选项,例如将客户数据存储为单独的文档,或者只存储数组中的ID与所有相关的客户数据。p> 与你的问题不太相关,但。。。您应该知道,您的数据模型中有一个无界数组条件(在您的经销商文档中以数组形式存储潜在的无限数量的客户)。更糟糕的是,您存储的是每个客户的全部信息,而不是一个客户ID。谢谢david、Larry和Aravind的建议,这对我很有帮助。与您的问题不太相关,但。。。您应该知道,您的数据模型中有一个无界数组条件(在您的经销商文档中以数组形式存储潜在的无限数量的客户)。更糟糕的是,您存储的是每个客户的完整信息,而不是客户ID。感谢david、Larry和Aravind的建议,这对我非常有帮助。。