2012-08-23 56 views
8

He desarrollado una API simple que le permite crear una serie de criterios de búsqueda dentro de una Colección MongoDB. Ahora necesito poder convertir esta matriz en una consulta real de Mongo, y esta parte es donde tengo una dificultad extrema.¿Cómo se generan consultas complejas con MongoDB y el controlador C#?

Lo ideal sería que yo después de una sintaxis que permitirá que haga el siguiente pseudocódigo:

var query = new QueryBuilder(); 
foreach (var group in groups) 
{ 
    switch (group.Condition) 
    { 
     case GroupCondition.Or: 
      query.Or(group.Queries); 
     break; 
     case GroupCondition.And: 
      query.And(group.Queries); 
     break; 
    } 
} 
return myCollection.FindAs(type, query); 

realidad quiero construir consultas un poco más compleja, pero al final estoy después de la funcionalidad para construir dinámicamente mis consultas con objetos como se ve en mi pseudo código anterior.

Siéntase libre de preguntarme detalles adicionales si no me he hecho suficientemente claro sobre lo que estoy tratando de lograr.

+0

Así que antes de llegar demasiado lejos, debería considerar el uso de Linq. – kelloti

+0

Lo mismo aquí. Veo que algunas personas usan ejemplos de Query con múltiples expresiones de consulta encadenadas juntas, sin embargo, cuando hago esto como Query.EQ(). GT(); no funciona ya que EQ/GT no devuelve un objeto de consulta. ¿Que me estoy perdiendo aqui? –

Respuesta

4

Parece que tiene la idea correcta ... Hay una clase llamada Query que es esencialmente un generador de consultas sin instanciación.

usando MongoDB.Driver.Builders;

Query.And, Query.Or, etc ... están todos allí. Es lo mismo que se usa debajo del proveedor de linq para generar consultas complejas.

+0

¿Alguien puede apuntar a un ejemplo que muestra múltiples selectores de consulta conectados? Parece que Query no es encadenable. –

+1

@RickStrahl construirlo como un AST. Query.Y ( Query.OR ( Query.EQ ("x", 1), Query.EQ ("y", 2)), Query.GT ("z", 3)); –

+0

@RickStrahl Terminé haciendo un lenguaje de búsqueda personalizado que se descompone, y luego compila en las consultas de Mongo (por lo tanto haciendo esta pregunta). El lenguaje de consulta se descartó al final, pero funcionó (¡con varias pruebas!). ¿Aún necesitas ayuda? He tenido la tentación de volver a crearlo y público como OSS, tal vez incluso publicar un paquete NuGet para algunos de los ayudantes. – JustinN

Cuestiones relacionadas