DocumentDB替换不工作

时间:2016-06-09 12:58:11

标签: azure azure-cosmosdb

我最近意识到DocumentDB通过ReplaceDocumentAsync支持独立更新操作。

我已使用Replace操作替换了下面的Upsert操作。

oncomplete="afterOrderBy(this)"

现在就是这样:

var result = _client
    .UpsertDocumentAsync(_collectionUri, docObject)
    .Result;

然而,现在我得到了例外:

  

Microsoft.Azure.Documents.BadRequestException:ResourceType Document是意外的。   ActivityId:b1b2fd71-3029-4d0d-bd5d-87d8d0a2fc95

不知道为什么,upsert和replace是相同的,并且对象与upsert相同,所以我希望它可以毫无问题地工作。

所有帮助表示赞赏。

由于

更新:尝试使用SelfLink方法实现此功能,并且适用于替换,但自身链接不适用于Upsert。这种行为令人困惑。我不喜欢我必须使用字符串连接在代码中构建自我链接。

3 个答案:

答案 0 :(得分:3)

我担心使用字符串连接构建自链接是您唯一的选择,因为{{1}}需要指向文档的链接。您在示例中显示了该集合的链接。它不会吮吸id并找到你想要的文件。

NPM模块documentdb-utils具有用于构建这些链接的库函数,但它只是使用字符串连接。我见过.NET的等效库,但我不记得在哪里。也许它现在是在Azure示例中,甚至在SDK中。

答案 1 :(得分:3)

您可以使用UriFactory帮助程序类为<替换构建文档链接:

var result = _client
    .ReplaceDocumentAsync(UriFactory.CreateDocumentUri(databaseId, collectionId, docObject.Id), docObject)
    .Result;

不幸的是,它并不是非常直观,正如拉里已经指出的那样,但是替换者希望文档已经存在,而一个upts就是它所说的。我会说两种不同的用例。

答案 2 :(得分:2)

要更新文档,您需要提供Collection Uri。如果您提供Document Uri,则返回以下内容:

  

ResourceType文档是意外的。

也许_collectionUri是一个Document Uri,赋值应该是这样的:

_collectionUri = UriFactory.CreateDocumentCollectionUri(DatabaseName, CollectionName);