MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Phân tích cú pháp truy vấn sql bằng cách sử dụng bộ phân tích cú pháp antlr tới tài liệu mongo bson trong Java

Trong một trong những công việc trước đây của tôi, tôi đã làm một việc tương tự:nhận một truy vấn (không phải là sql, nhưng khá giống) và dịch nó thành truy vấn mongo với antlr.

Tôi không có mã để chia sẻ, Tuy nhiên, tôi có thể chia sẻ suy nghĩ của mình:

  1. Mongo không tuân thủ SQL, vì vậy bạn không thể chỉ học ngữ pháp sql. Còn các JOIN và tất cả các đại số quan hệ thì sao? Còn về các tổng hợp khá phức tạp trong mongo với khung tổng hợp của chúng thì sao? Theo hướng ngược lại, làm thế nào để bạn tạo SQL được dịch thành mệnh đề "tồn tại" trong mongo. Có rất nhiều thứ như thế này, một số nhỏ, một số lớn, nhưng điểm mấu chốt bạn phải nói về một số loại tập hợp con của sql, một số DSL được phép sử dụng như một ngôn ngữ truy vấn và trông "giống" một sql bởi vì mọi người đã quen với SQL.

  2. Với ý nghĩ đó, bạn nên tạo ngữ pháp của riêng mình và Antlr sẽ tạo lexer / parser cho bạn. Bạn cũng sẽ được cấp phép kiểm tra cú pháp của truy vấn trong Runtime. Antlr sẽ không thể phân tích cú pháp truy vấn nếu nó không có định dạng chính xác rõ ràng, một số quy tắc ngữ pháp sẽ không thành công. Đây là một lý do khác để không sử dụng SQL "nguyên trạng".

  3. Cho đến nay, rất tốt, bạn đã tạo ra thính giả / khách truy cập của riêng mình. Trong trường hợp của tôi, tôi đã chọn tạo một biểu diễn đối tượng của truy vấn với trạng thái bên trong và mọi thứ. Vì vậy, truy vấn

Select id,name 
from employee 
where age > 30 
 and department = 'IT' 
limit 200

Đã được dịch sang các đối tượng kiểu:


class Query {
   private SelectClause select;
   private FromClause  from;
   private WhereClause where;
   private Limit        limit;
}

class SelectClause {
   private List<String> fields;
}
...
class WhereClause {
   Condition root;
}

interface Condition {
...
}

class AndCondition implements Condition { // the same for Not, Or

}

Đối với truy vấn cụ thể này, nó giống như:

Query q = new Query(new SelectClause(["id", "name"]), new FromClause("employee"), new WhereClause(new AndCondition(new SimpleLeafCondition("age", Operators.GT, 30), new  SimpleLeafCondition("department", Operators.EQ, "IT" )), new Limit(30));

Sau đó, có thể thực hiện một số tối ưu hóa trong truy vấn (như nhúng mệnh đề where nếu bạn cần, hoặc, ví dụ:thao tác phần "Đối với" nếu bạn đang làm việc trong môi trường nhiều người thuê và có các bộ sưu tập khác nhau cho những người thuê khác nhau).

Sau tất cả, bạn có thể sử dụng thiết kế "thông dịch viên" và phân tích cú pháp đệ quy các đối tượng truy vấn và "dịch" chúng thành truy vấn mongo hợp lệ. Tôi nhớ rằng bước này khiến tôi mất khoảng 1 ngày để hoàn thành (cách đây 7 năm với mongo 2 I đoán, nhưng vẫn), với cấu trúc chính xác của các đối tượng đại diện cho truy vấn, vì vậy điều này sẽ không phức tạp như vậy. Tôi đang đưa ra vấn đề này, bởi vì nó có vẻ là mối quan tâm chính của bạn trong câu hỏi.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Có thể nhập dữ liệu ép kiểu bên trong một đường ống tổng hợp trên MongoDB không?

  2. cách sắp xếp mảng đối tượng theo danh sách tùy ý trong mongo

  3. Mongoid 3 - truy cập kết quả map_reduce

  4. MongoDB $ max

  5. Cách hạn chế xóa trong MongoDB cho bộ sưu tập mối quan hệ