2011-05-25 11 views

Respuesta

31

No es exacto sin misma funcionalidad que desea.

Pero puede crear BsonDocument de JSON para consulta:

var jsonQuery = "{ x : 3, y : 'abc' }"; 
BsonDocument doc = MongoDB.Bson.Serialization 
        .BsonSerializer.Deserialize<BsonDocument>(jsonQuery); 

Y después de que se puede crear consulta desde BsonDocument:

var query = new QueryComplete(doc); // or probably Query.Wrap(doc); 

Lo mismo se puede hacer por la expresión de ordenación:

var jsonOrder = "{ x : 1 }"; 
BsonDocument orderDoc = BsonSerializer.Deserialize<BsonDocument>(jsonQuery); 

var sortExpr = new SortByWrapper(orderDoc); 

También puede crear el método de extensión para MongoCollection de esta manera:

public static List<T> GetItems<T>(this MongoCollection collection, string queryString, string orderString) where T : class 
{ 
    var queryDoc = BsonSerializer.Deserialize<BsonDocument>(queryString); 
    var orderDoc = BsonSerializer.Deserialize<BsonDocument>(orderString); 

    //as of version 1.8 you should use MongoDB.Driver.QueryDocument instead (thanks to @Erik Hunter) 
    var query = new QueryComplete(queryDoc); 
    var order = new SortByWrapper(orderDoc); 

    var cursor = collection.FindAs<T>(query); 
    cursor.SetSortOrder(order); 

    return cursor.ToList(); 
} 

No he probado el código anterior. Lo haré más tarde si es necesario.

Actualización:

acabo de probar el código anterior, está funcionando!

Se puede utilizar la siguiente manera:

clase
var server = MongoServer.Create("mongodb://localhost:27020"); 
var collection= server.GetDatabase("examples").GetCollection("SO"); 

var items = collection.GetItems<DocType>("{ x : 3, y : 'abc' }", "{ x : 1 }"); 
+0

esto se estrecha. Todavía me requiere analizar lo que el usuario ingresa y convertirlo en cláusulas separadas aunque. – pm100

+0

SortBy.Wrap no compila para mí en el último controlador de git. NO dicho método – pm100

+0

nuevo SortByWrapper (orderDoc) – pm100

0

Utilizando el official C# driver, que haría algo como esto:

var server = MongoServer.Create("mongodb://localhost:27017"); 
var db = server.GetDatabase("mydb"); 
var col = db.GetCollection("col"); 

var query = Query.And(Query.EQ("x", 3), Query.EQ("y", "abc")); 
var resultsCursor = col.Find(query).SetSortOrder("x"); 
var results = resultsCursor.ToList(); 

La consulta equivalente de la cáscara sería:

col.find({ x: 3, y: "abc" }).sort({ x: 1 }) 
+3

Thx Chris, pero esto no es lo que busco. Sé cómo crear una consulta como esa. Pero eso no es lo que quiero. Quiero que el usuario sea capaz de entrar en una cadena de consulta en mi aplicación, y luego ejecuto – pm100

+0

Ah, ok, no leyó la pregunta correctamente :) –

14

El QueryComplete parece haber quedado en desuso. Use MongoDB.Driver.QueryDocument en su lugar. Como continuación:

BsonDocument document = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>("{ name : value }"); 
QueryDocument queryDoc = new QueryDocument(document); 
MongoCursor toReturn = collection.Find(queryDoc); 
+1

Por favor, amplíe esta respuesta. – Stunner

+0

Gracias por proporcionar una solución relevante más recientemente. –

4

Éstas son algunas rutinas que utilizo para la conversión de la cadena y de los objetos de .NET BSON consultas (esto es parte del objeto de negocio de contenedor por lo que un par de referencias a esa clase):

public QueryDocument GetQueryFromString(string jsonQuery) 
    { 
     return new QueryDocument(BsonSerializer.Deserialize<BsonDocument>(jsonQuery)); 
    } 

    public IEnumerable<T> QueryFromString<T>(string jsonQuery, string collectionName = null) 
    { 
     if (string.IsNullOrEmpty(collectionName)) 
      collectionName = this.CollectionName; 

     var query = GetQueryFromString(jsonQuery);    
     var items = Database.GetCollection<T>(collectionName).Find(query); 

     return items as IEnumerable<T>; 
    } 


    public IEnumerable<T> QueryFromObject<T>(object queryObject, string collectionName = null) 
    { 
     if (string.IsNullOrEmpty(collectionName)) 
      collectionName = this.CollectionName; 

     var query = new QueryDocument(queryObject.ToBsonDocument()); 
     var items = Database.GetCollection<T>(collectionName).Find(query); 

     return items as IEnumerable<T>; 
    } 

El uso de estos es bastante fácil de realizar consultas a través de cuerda o de objetos parms: sintaxis

var questionBus = new busQuestion();   
var json = "{ QuestionText: /elimination/, GroupName: \"Elimination\" }"; 
var questions = questionBus.QueryFromString<Question>(json); 

foreach(var question in questions) { ... } 

o el uso de objeto:

var questionBus = new busQuestion();    
var query = new {QuestionText = new BsonRegularExpression("/elimination/"), 
       GroupName = "Elimination"}; 
var questions = questionBus.QueryFromObject<Question>(query); 

foreach(var question in questions) { ... } 

Me gusta la sintaxis del objeto simplemente porque es un poco más fácil escribir en código C# que tratar con citas incorporadas en cadenas JSON si están codificadas manualmente.

4

Aquí hay una función de servicio web que escribí que puede enviar en una consulta de filtro, límite y omisión para la paginación y una consulta de ordenación para cualquier colección que desee.Es genérico y rápido.

/// <summary> 
    /// This method returns data from a collection specified by data type 
    /// </summary> 
    /// <param name="dataType"></param> 
    /// <param name="filter">filter is a json specified filter. one or more separated by commas. example: { "value":"23" } example: { "enabled":true, "startdate":"2015-10-10"}</param> 
    /// <param name="limit">limit and skip are for pagination, limit is the number of results per page</param> 
    /// <param name="skip">skip is is the page size * page. so limit of 100 should use skip 0,100,200,300,400, etc. which represent page 1,2,3,4,5, etc</param> 
    /// <param name="sort">specify which fields to sort and direction example: { "value":1 } for ascending, {"value:-1} for descending</param> 
    /// <returns></returns> 
    [WebMethod] 
    public string GetData(string dataType, string filter, int limit, int skip, string sort) { 
     //example: limit of 100 and skip of 0 returns the first 100 records 

     //get bsondocument from a collection dynamically identified by datatype 
     try { 
      MongoCollection<BsonDocument> col = MongoDb.GetConnection("qis").GetCollection<BsonDocument>(dataType); 
      if (col == null) { 
       return "Error: Collection Not Found"; 
      } 

      MongoCursor cursor = null; 
      SortByWrapper sortExpr = null; 

      //calc sort order 
      try { 
       BsonDocument orderDoc = BsonSerializer.Deserialize<BsonDocument>(sort); 
       sortExpr = new SortByWrapper(orderDoc); 
      } catch { } 

      //create a query from the filter if one is specified 
      try { 
       if (filter != "") { 
        //sample filter: "{tags:'dog'},{enabled:true}" 
        BsonDocument query = BsonSerializer.Deserialize<BsonDocument>(filter); 
        QueryDocument queryDoc = new QueryDocument(query); 
        cursor = col.Find(queryDoc).SetSkip(skip).SetLimit(limit); 

        if (sortExpr != null) { 
         cursor.SetSortOrder(sortExpr); 
        } 

        return cursor.ToJson(); 
       } 
      } catch{} 


      //if no filter specified or the filter failed just return all 
      cursor = col.FindAll().SetSkip(skip).SetLimit(limit); 

      if (sortExpr != null) { 
       cursor.SetSortOrder(sortExpr); 
      } 

      return cursor.ToJson(); 
     } catch(Exception ex) { 
      return "Exception: " + ex.Message; 
     } 
    } 

Suponiendo que habían estos registros en mi colección llamada "MyTest2":

[{ "_id" : ObjectId("54ff7b1e5cc61604f0bc3016"), "timestamp" : "2015-01-10 10:10:10", "value" : "23" }, 
{ "_id" : ObjectId("54ff7b415cc61604f0bc3017"), "timestamp" : "2015-01-10 10:10:11", "value" : "24" }, 
{ "_id" : ObjectId("54ff7b485cc61604f0bc3018"), "timestamp" : "2015-01-10 10:10:12", "value" : "25" }, 
{ "_id" : ObjectId("54ff7b4f5cc61604f0bc3019"), "timestamp" : "2015-01-10 10:10:13", "value" : "26" }] 

que podría hacer la llamada de servicio web con los siguientes parámetros para volver 100 registros a partir de la primera página en valor> = 23 y el valor < = 26, con el fin

dataType: mytest2 
filter: { value: {$gte: 23}, value: {$lte: 26} } 
limit: 100 
skip: 0 
sort: { "value": -1 } 

Disfrute descendente!

Cuestiones relacionadas