2016-06-28 2 views
0

Я некоторое время боролся с этим. Вот мой документ.DocumentDB: Как обновить значение частичного свойства

{ 
    "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 Stackoverflow!"); 

Document updated = await client.ReplaceDocumentAsync(doc); 

Есть два параметра, передаваемые в эту функцию. Идентификатор и язык. Например, я хочу обновить свойство Content до "Welcome to Stackoverflow!" для Id = "1" и Language="En". Дело в том, мой код будет удалить другую "Language": "Fr", "Content": "Bienvenue!" части и обновить свой документ что-то вроде этого:

{ 
    "id": "1", 
    "Scenario": "Welcome page", 
    "Language": "En", 
    "Content": "Welcome to Stackoverflow!", 
    "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 Stackoverflow!" 
     }, 
     { 
     "Language": "Fr", 
     "Content": "Bienvenue!" 
     } 
    ], 
    "LastModified": "2016-05-27T17:27:58.562-06:00", 
    "ModifiedBy": "admin", 
    "LastAccessed": "2016-06-13T10:27:58.562-06:00" 
} 

Так как я могу обновить только частичным свойство документа, не испортив другие свойства?

ответ

0

Я думаю, что ваш пример может быть выключен, пока вы показываете текущий результат, включая запись Fr/Bienvenue, но независимо, у DocumentDB нет обновления на месте. Вы должны прочитать документ, обновить его на стороне клиента, а затем снова сохранить его поверх старой. В качестве альтернативы вы можете денормализовать свой список переводов в отдельные документы с «внешними ключами» обратно в Сценарий, к которому он относится.

+0

Нет, пример - именно то, что я хочу. Я хочу обновить Английский Контент, не затрагивая французскую собственность. В моем коде я прочитал документ, но не смог обновить английский контент с клиентской стороны, потому что я понятия не имею, как обновлять английский контент внутри строки
«doc.SetPropertyValue (« Содержимое »,« Добро пожаловать в Stackoverflow! »).);»
Возможно ли, что в DocumentDB возможно только обновление одного из дочерних свойств? –

+0

Нет, замените или вставьте целые документы. –

+0

Да, после некоторых исследований я понял, что обновление частичного свойства невозможно. Я в порядке со мной, что мне нужно заменить весь документ. Но моя проблема заключается в том, как обновить одно из дочерних свойств «Содержимое»: «Добро пожаловать!» и не влияет на другой «Контент»: «Bienvenue!». Единственный способ найти свойство документа - использовать «SetPropertyValue». Это моя проблема: у меня есть два свойства Content. Есть ли способ сделать что-то вроде SetPropertyValue («Контент», «Добро пожаловать в Stackoverflow!»). Где (Language = «En»)? Благодаря! –