2012-01-17 18 views
5

Tôi đang cố gắng để tạo ra một truy vấn mà tìm tất cả, mọi thứ lớn màu đỏ với một lớn hơn chi phí hơn 3.Làm cách nào để tự động áp dụng toán tử điều kiện cho trường bằng Trình điều khiển MongoDB-CSharp chính thức?

Truy vấn này có vẻ là những gì tôi sau:

{ "color" : "red", "size" : "large", "cost" : { "$gt" : 3.0 } } 

Nhưng, tôi không thể tìm thấy một cách thanh lịch để tạo điều kiện chi phí bằng cách sử dụng trình điều khiển chính thức MongoDB CSharp. Đây là một cuộc tấn mà dường như để tạo ra các truy vấn:

QueryConditionList gt = Query.GT("cost", BsonDouble.Create(3)); 

QueryDocument query = new QueryDocument(); 
query.Add("color", "red"); 
query.Add("size", "large"); 
query.Add(gt.ToBsonDocument().Elements); 

List<BsonDocument> results = events.Find(query).ToList(); 

Một cách khác để làm điều đó mà dường như để làm việc là như thế này:

QueryDocument query = new QueryDocument(); 
query.Add("color", "red"); 
query.Add("size", "large"); 
query.Add("cost", new BsonDocument("$gt", BsonDouble.Create(3))); 

List<BsonDocument> results = events.Find(query).ToList(); 

Là một trong những cách tiếp cận một cách tốt để thực hiện điều này? Có cái nào khác không?

Tôi cần sử dụng các kỹ thuật cho phép tôi tạo động truy vấn và thêm các trường sẽ tham gia vào truy vấn. Tôi đã hy vọng tìm một cách để thêm một điều kiện thông qua query.Add() nhưng tôi không biết nếu đó là có thể.

Mọi trợ giúp đều được đánh giá cao.

Trả lời

6

Bạn có thể sử dụng xây dựng truy vấn trong suốt, như vậy:

var query = Query.And(
       Query.EQ("color", "red"), 
       Query.EQ("size", "large"), 
       Query.GT("cost", 3) 
      ); 

cập nhật Xin lỗi, tôi thấy những gì bạn đang hỏi, bây giờ.

Bạn có thể làm một cái gì đó như thế này, cũng:

int i = 0; 
var qc = QueryComplete[3]; 
qc[i++] = Query.EQ("color", "red"); 
qc[i++] = Query.EQ("size", "large"); 
qc[i++] = Query.GT("cost", 3); 
var query = Query.And(qc); 

Bằng cách này, bạn vẫn có thể sử dụng các phương pháp xây dựng và có nó phải năng động.

+0

Cảm ơn bạn. Thực tế là Query.And trả về một QueryComplete đã ném tôi đi. Tôi cứ suy nghĩ về cách bạn có thể xây dựng một biểu thức LINQ. Cảm ơn bạn đã chỉ ra rằng nó có một mảng và không chỉ là toán hạng. Về cơ bản tôi đã làm những gì bạn thêm vào với bản chỉnh sửa của mình và có vẻ như nó hoạt động rất tốt. – Vyrotek

2

Bạn dữ liệu có thể lái nó một cách brute force, chỉ cần xây dựng một cây "QueryElement" và gọi BuildQuery đệ quy xây dựng nó như trong ví dụ lớp này:

public class QueryElement 
    { 
     public enum eOperator 
     { 
      AND, OR, EQ, NE, GT, GTE, LT, LTE  //etc. 
     }; 

     public eOperator Operator { get; set; } 

     public string Field { get; set; } 

     public BsonValue Value { get; set; } 

     public List<QueryElement> Children { get; set; } 

     public IMongoQuery BuildQuery() 
     { 
      int i = 0; 
      var qc = new IMongoQuery[(Children!=null)?Children.Count:0]; 

      if (Children != null) 
      { 
       foreach (var child in Children) 
       { 
        qc[i++] = child.BuildQuery(); 
       } 
      } 

      switch (Operator) 
      { 
       // multiple element operators 

       case eOperator.AND: 
        return Query.And(qc); 
       case eOperator.OR: 
        return Query.And(qc); 

       // single element operators 
       case eOperator.EQ: 
        return Query.EQ(Field, Value); 
       case eOperator.NE: 
        return Query.NE(Field, Value); 
       case eOperator.GT: 
        return Query.GT(Field, Value); 
       case eOperator.GTE: 
        return Query.GTE(Field, Value); 
       case eOperator.LT: 
        return Query.LT(Field, Value); 
       case eOperator.LTE: 
        return Query.LTE(Field, Value); 
      } 
      return null; 
     } 
    } 
Các vấn đề liên quan