ravendb - portable - Raven DB: ¿Cómo puedo eliminar todos los documentos de un tipo dado?
ravendb vs mongodb (4)
Asumo que quieres hacer esto desde el cliente .NET. Si es así, utilice el índice estándar DocumentsByEntityName
:
var indexQuery = new IndexQuery { Query = "Tag:" + collectionName };
session.Advanced.DocumentStore.DatabaseCommands.DeleteByIndex(
"Raven/DocumentsByEntityName",
indexQuery,
new BulkOperationOptions { AllowStale = true });
var hilo = session.Advanced.DocumentStore.DatabaseCommands.Get("Raven/Hilo/", collectionName);
if (hilo != null) {
session.Advanced.DocumentStore.DatabaseCommands.Delete(hilo.Key, hilo.Etag);
}
Donde collectionName
es el nombre real de su colección.
La primera operación borra los elementos. El segundo borra el archivo HiLo .
También revise la documentación oficial - Cómo eliminar o actualizar documentos usando el índice .
Más específicamente en Raven DB, quiero crear un método genérico con una firma como;
public void Clear<T>() {...
Luego haga que Raven DB borre todos los documentos del tipo dado.
Entiendo de otras publicaciones de Ayende a preguntas similares que necesitaría un índice para hacer esto como un lote.
Creo que esto implicaría crear un índice que mapee cada tipo de documento, esto parece ser mucho trabajo.
¿Alguien sabe una forma eficiente de crear un método como el anterior que haga un borrado de conjunto directamente en la base de datos?
Después de mucha experimentación, encontré que la respuesta era bastante simple, aunque lejos de ser obvia;
public void Clear<T>()
{
session.Advanced.DocumentStore.DatabaseCommands.PutIndex(indexName, new IndexDefinitionBuilder<T>
{
Map = documents => documents.Select(entity => new {})
});
session.Advanced.DatabaseCommands.DeleteByIndex(indexName, new IndexQuery());
}
Por supuesto, es casi seguro que no definiría su índice y eliminaría de una sola vez, lo he puesto como un método único por razones de brevedad.
Mi propia implementación define los índices en el inicio de la aplicación según lo recomendado por la documentación.
Si quisiera usar este enfoque para indexar realmente una propiedad de T, entonces tendría que restringir T. Por ejemplo, si tengo una entidad de la que todas mis clases de documentos se heredan y esta clase especifica una identificación de propiedad. Luego, un ''donde T: IEntity'' le permitiría usar esa propiedad en el índice.
Se ha dicho en otros lugares, pero también vale la pena señalar que una vez que defina un índice estático, Raven probablemente lo usará, esto puede hacer que sus consultas no devuelvan los datos que ha insertado:
Puede hacerlo utilizando: http://blog.orangelightning.co.uk/?p=105
Yo también tuve este problema y esta es la solución que funcionó para mí. Solo estoy trabajando en un proyecto de prueba, por lo que esto podría ser lento para un db más grande, pero la respuesta de Ryan no funcionó para mí.
public static void ClearDocuments<T>(this IDocumentSession session)
{
var objects = session.Query<T>().ToList();
while (objects.Any())
{
foreach (var obj in objects)
{
session.Delete(obj);
}
session.SaveChanges();
objects = session.Query<T>().ToList();
}
}