Ошибки при обновлении Json с пустыми элементами массива - PullRequest
1 голос
/ 19 ноября 2011

Я изменяю документ Json с помощью кода. Json имеет массив вложенных элементов. Мой код терпит неудачу, потому что я считаю, что он не в состоянии обрабатывать документы Json, где этот конкретный массив пуст. Как я могу проверить наличие пустых или пустых массивов и заставить этот код работать только для массивов с данными.

store.DatabaseCommands.UpdateByIndex("Raven/DocumentsByEntityName",
new IndexQuery { Query = "Tag:patrons" },
new[]
{
  new PatchRequest
      {
          Type = PatchCommandType.Modify,
          Name = "Privilege",
          Nested = new[]
           {
             new PatchRequest {Type = PatchCommandType.Set, Name="Level",  

             Value="Gold"}, 
           }
       }
}, allowStale: false);

Документ Json выглядит так:

    {
             "Privilege": [{
                           "Level": "Gold",
                           "Code": "12312",
                           "EndDate": "12/12/2012"
                          }],
             "Phones":    [{
                           "Cell": "123123",
                           "Home": "9783041284",
                           "Office": "1234123412"
                          }]
             "MiddleInitial":"F"

           }

Некоторые документы Json могут выглядеть (обратите внимание, что Privilege - это пустой массив в этом случае)

 {
         "Privilege": [],
         "Phones":    [{
                       "Cell": "123123",
                       "Home": "9783041284",
                       "Office": "1234123412"
                      }]
         "MiddleInitial":"F"

       }

Ответы [ 2 ]

2 голосов
/ 25 ноября 2011

Команда исправления ожидает, что данные будут там, поэтому вам нужно использовать индекс, чтобы найти документы, у которых нет пустого Privileges списка.

Сначала вам нужен такой индекс:

public override IndexDefinition CreateIndexDefinition()
{
    return new IndexDefinitionBuilder<Patron>
    {
        Map = docs => from doc in docs
                      where doc.Privileges != null
                      select new { HasPrivileges = doc.Privileges.Count == 0 ? false : true }
    }.ToIndexDefinition(Conventions);
}

Затем вы применяете патч только к документам, где HasPrivileges = true, например:

store.DatabaseCommands.UpdateByIndex("PatronByPrivilege",
              //Only apply the patch to Patrons that have a privilege
              new IndexQuery { Query = "HasPrivileges:true" },
                     new[]
                     {
                          new PatchRequest
                          {
                               .........

Я создал образец полного кода ,любые проблемы, дайте мне знать.

1 голос
/ 20 ноября 2011

похоже, что вы пытаетесь установить свойство для массива, но у массивов нет свойств, они могут содержать только другие объекты.

...