2012-05-14 857 views
7

Estoy tratando de actualizar una colección anidada utilizando la API de revisión. Más específicamente, consideremos el siguiente ejemplo - una colección de Mensajes:RavenDB Patch API: actualización de una colección anidada

{ 
    "Title": "Hello RavenDB", 
    "Category": "RavenDB", 
    "Content": "This is a blog about RavenDB", 
    "Comments": [ 
    { 
     "Title": "Unrealistic", 
     "Content": "This example is unrealistic" 
    }, 
    { 
     "Title": "Nice", 
     "Content": "This example is nice" 
    } 
    ] 
} 

he utilizado la API de parches y documentación de operación basados ​​Set-a http://ravendb.net/docs/client-api/partial-document-updates y http://ravendb.net/docs/client-api/set-based-operations así como varias preguntas StackOverflow como recursos para hacer una actualización masiva a través de operaciones de conjuntos y un índice estático. Un requisito es actualizar el "Título" de un comentario solo cuando el valor anterior era "Bueno" y, de ser así, actualizarlo a "Malo".

Los índices estáticos "NicePosts" se define como:

Map = posts => from post in posts  
       where post.Comments.Any(comment => comment.Title == "Nice") 
       select new {post.Title, post.Category} 

El comando mayor parche de actualización es:

documentStore.DatabaseCommands.UpdateByIndex("NicePosts", 
        new IndexQuery(),            
      new[] { new PatchRequest 
        { Type = PatchCommandType.Modify,       
        Name = "Comments", 
         PrevVal = RavenJObject.Parse(@"{ ""Title"": ""Nice""}"), 
         Nested = new[] 
           { 
           new PatchRequest {Type = PatchCommandType.Set, Name = "Title", Value = new RavenJValue("Bad") }, 
         } }, allowStale: true); 

Tengo algunas preguntas con respecto a este:

1) es mi estructura/sintaxis para el comando de actualización correcta?

2) Me gustaría que la actualización se realice en todos los registros de la colección. Por lo tanto, no he definido el filtro de consulta en IndexQuery Query porque el índice "NicePosts" ya devuelve el conjunto apropiado. Sin embargo, ejecutar este comando no actualiza la colección.

3) Si configuro "allowStale: false" obtengo un error de "índice obsoleto". Antes de abrir la sesión de mi tienda de documentos, instanciamos la clase de índice y la ejecutamos para que persista en la instancia de ravenDB. ¿Alguna idea de lo que está yendo mal aquí?

Gracias,

EDIT:

Sobre la base de la recomendación de a'vron cambió comando Parche para:

documentStore.DatabaseCommands.UpdateByIndex("NicePosts", 
             new IndexQuery(), 
             new[] { 
                new PatchRequest { 
                Type = PatchCommandType.Modify, 
                Name = "Comments", 
                Position = 0, 
                Nested = new[] { 
                 new PatchRequest {Type = PatchCommandType.Set, Name = "Title", Value = new RavenJValue("Bad")}, 
                } 
                } 
               }, allowStale: false); 

Respuesta

3

No se puede utilizar el comando de parche para actualizar los valores basados ​​en el valor existente en el formación. Debe especificar la posición real.

+0

Gracias Ayende yo no era consciente de ello. Eliminé prevVal y agregué Posición = 0 y guardé "nueva IndexQuery()" pero el valor todavía no se está actualizando. ¿Hay algo más que deba cambiar? Agregué el comando de parche editado en la publicación original. – fjxx

+0

Acabo de usar "nuevo IndexQuery {}" y todo funciona ahora. Gracias ! – fjxx

9

Esto ahora se puede hacer mediante el scripted patch request:

string oldTitle = "Nice"; 
string newTitle = "Bad"; 

documentStore.DatabaseCommands.UpdateByIndex("NicePosts", 
    new IndexQuery(),            
    new ScriptedPatchRequest 
    {      
     Script = @"for (var i = 0; i < this.Comments.length; i++) 
         if (this.Comments[i].Title == oldTitle) 
          this.Comments[i].Title = newTitle;", 
     Values = 
     { 
      { "oldTitle", oldTitle }, 
      { "newTitle", newTitle }, 
     }, 
    } 
); 
+0

Usaría un índice para consultar por el título del comentario para acelerar la solicitud del parche; es más rápido realizar consultas que filtrar todos los resultados de índice en JS. – CMircea

+0

Esta debería ser la respuesta aceptada – jolySoft

Cuestiones relacionadas