来自 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
(例如,您的可以不同),则文档的标识是 id
和 myPK
的值(或您的分区中的任何一个)关键定义)属性。调用 Upsert
时,如果存在具有相同 id
和 myPK
值的文档,它将被更新,如果不存在,则将创建一个包含正文的新文档。
POST 时(从 Postman),我最终得到了具有相同“_id”的重复文档。查看示例
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
(例如,您的可以不同),则文档的标识是 id
和 myPK
的值(或您的分区中的任何一个)关键定义)属性。调用 Upsert
时,如果存在具有相同 id
和 myPK
值的文档,它将被更新,如果不存在,则将创建一个包含正文的新文档。