DocumentDB:如何更新部分 属性 值
DocumentDB: How to Update Partial Property Value
我已经为此苦苦挣扎了一段时间。这是我的文档。
{
"id": "1",
"Scenario": "Welcome page",
"Translations": [
{
"Language": "En",
"Content": "Welcome!"
},
{
"Language": "Fr",
"Content": "Bienvenue!"
}
],
"LastModified": "2016-05-27T17:27:58.562-06:00",
"ModifiedBy": "admin",
"LastAccessed": "2016-06-13T10:27:58.562-06:00"
}
这里是我更新 属性 的代码(我在这里硬编码了要修改的值):
SqlQuerySpec query = new SqlQuerySpec()
{
QueryText = "SELECT c.id, c.Scenario, t.Language, t.Content, c.LastModified, c.ModifiedBy, c.LastAccessed FROM MultiLanguage as c join t in c.Translations where c.id = @Id and t.Language = @Language",
Parameters = new SqlParameterCollection() { new SqlParameter("@Id", Id), new SqlParameter("@Language", Language) }
};
Document doc = client.CreateDocumentQuery<Document>(
collectionLink, query).AsEnumerable().FirstOrDefault();
doc.SetPropertyValue("Content", "Welcome to Whosebug!");
Document updated = await client.ReplaceDocumentAsync(doc);
有两个参数传递给这个函数。身份和语言。例如,对于 Id = "1"
和 Language="En"
,我只想将 属性 内容更新为 "Welcome to Whosebug!"
。问题是我的代码将删除其他 "Language": "Fr"
、"Content": "Bienvenue!"
部分并将我的文档更新为如下内容:
{
"id": "1",
"Scenario": "Welcome page",
"Language": "En",
"Content": "Welcome to Whosebug!",
"LastModified": "2016-05-27T17:27:58.562-06:00",
"ModifiedBy": "admin",
"LastAccessed": "2016-06-13T10:27:58.562-06:00"
}
但我想要的是:
{
"id": "1",
"Scenario": "Welcome page",
"Translations": [
{
"Language": "En",
"Content": "Welcome to Whosebug!"
},
{
"Language": "Fr",
"Content": "Bienvenue!"
}
],
"LastModified": "2016-05-27T17:27:58.562-06:00",
"ModifiedBy": "admin",
"LastAccessed": "2016-06-13T10:27:58.562-06:00"
}
那么我怎样才能只更新文档的部分 属性 而不会弄乱其他属性?
DocumentDB 没有适当的更新。您必须阅读文档,在客户端更新它,然后将其重新保存在旧文档的顶部。或者,您可以将翻译列表非规范化为单独的文档,并 "foreign keys" 返回到它相关的场景。
我已经为此苦苦挣扎了一段时间。这是我的文档。
{
"id": "1",
"Scenario": "Welcome page",
"Translations": [
{
"Language": "En",
"Content": "Welcome!"
},
{
"Language": "Fr",
"Content": "Bienvenue!"
}
],
"LastModified": "2016-05-27T17:27:58.562-06:00",
"ModifiedBy": "admin",
"LastAccessed": "2016-06-13T10:27:58.562-06:00"
}
这里是我更新 属性 的代码(我在这里硬编码了要修改的值):
SqlQuerySpec query = new SqlQuerySpec()
{
QueryText = "SELECT c.id, c.Scenario, t.Language, t.Content, c.LastModified, c.ModifiedBy, c.LastAccessed FROM MultiLanguage as c join t in c.Translations where c.id = @Id and t.Language = @Language",
Parameters = new SqlParameterCollection() { new SqlParameter("@Id", Id), new SqlParameter("@Language", Language) }
};
Document doc = client.CreateDocumentQuery<Document>(
collectionLink, query).AsEnumerable().FirstOrDefault();
doc.SetPropertyValue("Content", "Welcome to Whosebug!");
Document updated = await client.ReplaceDocumentAsync(doc);
有两个参数传递给这个函数。身份和语言。例如,对于 Id = "1"
和 Language="En"
,我只想将 属性 内容更新为 "Welcome to Whosebug!"
。问题是我的代码将删除其他 "Language": "Fr"
、"Content": "Bienvenue!"
部分并将我的文档更新为如下内容:
{
"id": "1",
"Scenario": "Welcome page",
"Language": "En",
"Content": "Welcome to Whosebug!",
"LastModified": "2016-05-27T17:27:58.562-06:00",
"ModifiedBy": "admin",
"LastAccessed": "2016-06-13T10:27:58.562-06:00"
}
但我想要的是:
{
"id": "1",
"Scenario": "Welcome page",
"Translations": [
{
"Language": "En",
"Content": "Welcome to Whosebug!"
},
{
"Language": "Fr",
"Content": "Bienvenue!"
}
],
"LastModified": "2016-05-27T17:27:58.562-06:00",
"ModifiedBy": "admin",
"LastAccessed": "2016-06-13T10:27:58.562-06:00"
}
那么我怎样才能只更新文档的部分 属性 而不会弄乱其他属性?
DocumentDB 没有适当的更新。您必须阅读文档,在客户端更新它,然后将其重新保存在旧文档的顶部。或者,您可以将翻译列表非规范化为单独的文档,并 "foreign keys" 返回到它相关的场景。