来自 Azure Function 的 Cosmos DB upsert - 不更新,只插入

Cosmos DB upsert from Azure Function - not updating, only inserting

POST 时(从 Postman),我最终得到了具有相同“_id”的重复文档。查看示例 and ,我想知道我的问题是否是在我的 Cosmos DB 实例中没有正确设置某些内容? 示例:

if I update my shape's color to orange, I get another document with the key of 1 but what I'm expecting is to see a single document with the key of 1 with a shape that has the color orange.

函数:

public static void Run(
  ILogger logger,
  [EventGridTrigger] EventGridEvent e,
  [CosmosDB(
      databaseName: "myDatabase",
      collectionName: "myCollection",
      ConnectionStringSetting = "COSMOS_CONNECTION_STRING")] out MyObject myObjectDocument
  )
  {
      logger.LogInformation("Event received {type} {subject}", e.EventType, e.Subject);

      myObjectDocument = JsonConvert.DeserializeObject<MyObject>(e.Data.ToString());

      logger.LogInformation(myObjectDocument.some.thing);
}

有效载荷:

[
  {   
      "topic": "Topic",
      "id": "1",   
      "eventType": "EventType",   
      "subject": "Subject",   
      "eventTime": "2012-08-10T21:04:07+00:00",
      "data" : {
        "id" : 1,
        "effectiveDate" : "2020-10-18 15:00:00",
        "shape" : {
            "_id" : "1000",
            "color" : "green",
            "name" : "square"
        }
      },
       "dataVersion": "2.0",   
       "metadataVersion": "1"
  }
]

编辑: 分区键是“id” Matias Quaranta 的回答和评论起到了作用。另请注意,分区键必须是 string 而不是 int

cosmos DB 中的项目只有在 Id 和 partition key 相同时才能唯一。如果partition key不同,但Id相同,item不唯一

_id 是 Mongo 的文档标识符。

Cosmos DB SQL API 使用 id。您正在获得“重复项”,因为您依赖于匹配 _id 的值,并且您可以拥有数百万个具有相同 _id 但不同 id.

的文档

SQL API 中的文档身份是 id 的值和分区键。如果您的容器的分区键定义为 /myPK(例如,您的可以不同),则文档的标识是 idmyPK 的值(或您的分区中的任何一个)关键定义)属性。调用 Upsert 时,如果存在具有相同 idmyPK 值的文档,它将被更新,如果不存在,则将创建一个包含正文的新文档。