2011-06-18 43 views
11

Có thể để diễn tả các truy vấn SQL sau đây trong MongoDB:MongoDB tìm bằng cách so sánh giá trị lĩnh vực

SELECT * FROM table AS t WHERE t.field1 > t.filed2; 

chỉnh sửa: Để tóm tắt :.

  1. sử dụng trường thứ ba lưu trữ "field1 - field2" gần như hoàn hảo, nhưng yêu cầu bảo dưỡng thêm một chút.
  2. $ nơi sẽ tải và đánh giá bằng JavaScript và sẽ không sử dụng bất kỳ chỉ mục nào. Không tốt cho dữ liệu lớn.
  3. bản đồ/giảm có cùng một vấn đề và sẽ đi trough tất cả hồ sơ thậm chí nếu chúng ta chỉ cần một
+0

Tôi không muốn bắt đầu một cuộc chiến tranh ngọn lửa nhưng chúa ơi, tôi ghét NoSQL rất nhiều. – Blago

+1

sau đó không sử dụng nó nếu bạn không biết ở đâu và làm thế nào để sử dụng nó đúng cách. NoSQL KHÔNG phải là sự thay thế cho cơ sở dữ liệu quan hệ! –

+0

Đây là nguồn gốc của sự thất vọng của tôi. Hầu hết mọi người đề cập đến nó như thể nó là một sự thay thế. Tôi thấy nhiều hơn và nhiều hơn nữa so sánh dọc theo các dòng cũ (quan hệ) vs hiện đại (noSQL) lưu trữ dữ liệu. – Blago

Trả lời

17

Bạn có thể làm điều này bằng $where:

db.coll.find({ $where: "this.field1 > this.field2" }); 

Nhưng:

javascript thực hiện chậm hơn so với các nhà khai thác bản địa, nhưng nó là rất linh hoạt

Nếu hiệu suất là một vấn đề tốt hơn để đi theo cách được gợi ý bởi @yi_H.

+1

Sử dụng $ mà không bao giờ được đề xuất. Câu trả lời của yi_H là câu trả lời đúng! –

+3

@Sentinel: Bạn đã đọc câu trả lời của tôi cho đến cuối trước khi bỏ phiếu xuống ????? Tôi nói rằng javascript làm việc chậm và tốt hơn để tạo thêm trường như @yi_H đề xuất. Nhưng trong bất kỳ cách nào $ nơi mà nhà điều hành tồn tại tôi hoàn toàn chắc chắn rằng nó có thể được sử dụng trong một số tình huống khi hiệu suất không phát hành. –

+2

Chỉ sử dụng tính năng này nếu bạn có một bộ sưu tập nhỏ hoặc lọc trước bộ sưu tập với các điều kiện khác (sử dụng chỉ mục và trả về một tập con nhỏ của bộ sưu tập). Mongo không có ý tưởng làm thế nào để tăng tốc độ truy vấn này và sẽ thực hiện quét toàn bộ bảng. –

15

Bạn có thể lưu trữ trong tài liệu của bạn field1 - field2 như field3, sau đó tìm kiếm { field3: { $gt: 0 } }

Nó cũng có thể nhận các tài liệu phù hợp với Mapreduce.

+7

Tôi nên đề cập rằng bạn có thể lưu trữ giá trị boolean, đó là hiệu suất tốt hơn. –

3

Bạn có thể sử dụng $ where. Chỉ cần lưu ý rằng nó sẽ khá chậm (phải thực thi mã Javascript trên mỗi bản ghi) để kết hợp với các truy vấn được lập chỉ mục nếu bạn có thể.

db.T.find({ $where: function() { return this.Grade1 > this.Grade2 } }); 

hoặc nhỏ gọn hơn:

db.T.find({ $where : "this.Grade1 > this.Grade2" }); 
Các vấn đề liên quan