没有文档的ReplaceDocumentAsync是可能的吗?

时间:2019-02-16 06:49:54

标签: azure azure-cosmosdb

我查询文档并将其发送到我的Angular应用程序。然后,我编辑模型并将其发送回去。我的问题是只能从模型更新文档吗? Document没有任何构造函数,而ReplaceDocumentAsync需要Document吗?还是我必须先查询文档只是为了得到相同的对象,然后我才需要编辑?

public void Put([FromBody] VesselView vessel)
{
   var collectionLink = UriFactory.CreateDocumentCollectionUri("AssetControl", "Vessels");
  _cosmosDocClient.ReplaceDocumentAsync(vessel);

}

2 个答案:

答案 0 :(得分:0)

您需要首先检索原始文档。它包含内部属性,例如public class User implements Serializable { ... @ManyToMany(fetch = FetchType.LAZY) private List<User> followers; ... } (用于并发检查),否则将无法使用。

答案 1 :(得分:0)

是的。。您只需要知道要替换的文档id。 已通过.Net客户端Microsoft.Azure.DocumentDB v2.2.1。进行了测试。

JObject 传递预期的新文档可以实现此目的。您可以为此使用任何Json序列化器。另外,请注意,您的模型不必包含内部文档字段,例如_rid_ts

示例代码:

var client = new DocumentClient(url, key, policy);
var documentUri = UriFactory.CreateDocumentUri("myDB", "myCollection", "_replaceTest");

var newModel = JObject.Parse(@"{""id"": ""_replaceTest"",   ""myData"": ""replaced!""}");
var response = await client.ReplaceDocumentAsync(documentUri, newModel);
var fromStorage = response.Resource;

返回的模型是包含额外模型字段的完整模型:

{
  "id": "_replaceTest",
  "_rid": "FOOBAR==",
  "_self": "dbs/FOO==/colls/BAR=/docs/FOOBAR==/",
  "_ts": 1550491238,
  "_etag": "\"0000e379-0000-0000-0000-5c6a9e660000\"",
  "myData": "replaced!"
}

很明显,正如David Makogon所暗示的那样,除非您将此属性包括在发送给DocumentDB的模型中,否则您不能依靠_etag进行这种检查。