2011-01-13 39 views
5

tôi có một cái nhìn couchdb "record_by_date_product" với định nghĩa sau đây:Cách truy vấn chế độ xem couchdb bằng cách sử dụng khóa tổng hợp?

function(doc) { 
    emit([doc.logtime, doc.product_id], doc); 
} 

Tôi cố gắng để chạy một truy vấn được một cái gì đó như:

(logtime > fromdate & logtime < todate) & product_id in (1,2,6) 

Đây có phải là có thể với quan điểm này?

Tôi cũng đang sử dụng thư viện python couchdb để truy cập couchdb. Dưới đây là một đoạn mã:

server = couchdb.Server() 
db = server['mydb'] 

results = db.view('_design/record_by_date_product/_view/record_by_date_product') 

này trang http://packages.python.org/CouchDB/client.html#viewresults xác định rằng chúng ta có thể sử dụng một startkey và endkey. Nhưng tôi không thể làm cho nó hoạt động được.

Cảm ơn

Trả lời

5

Tôi nghĩ rằng tôi chỉ tìm thấy câu trả lời chính xác:

Thiết kế một cái nhìn 'sampleview' mà là giống như:

{ 
    "records_by_date_product": { 
     "map": "function(doc) {\n emit([doc.prod_id, doc.logtime], doc);\n}" 
    } 
} 

Chúng ta hãy nói rằng các tham số truy vấn là:

prod_id in [1,3] 
from_date = '2010-01-01 00:00:00' 
to_date = '2010-01-02 00:00:00' 

Sau đó, bạn sẽ phải chạy 2 truy vấn riêng biệt trên cùng một chế độ xem:

http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\["1,2010-01-01%2000:00:00"\]'&endkey='\[1,"2010-01-02%2000:00:00"\]' 

http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\[2,"2010-01-01%2000:00:00"\]'&endkey='\[2,"2010-01-02%2000:00:00"\]' 

Lưu ý rằng cùng một truy vấn được chạy mỗi lần ngoại trừ việc prod_id được thay đổi trong truy vấn thứ hai. Kết quả phải được đối chiếu sau. Hi vọng điêu nay co ich!

+1

Bạn chỉ là một người, đúng không? Bạn vừa trả lời câu hỏi của riêng bạn và nói "Hy vọng điều này sẽ giúp." Dù sao, điều này sẽ không hoạt động, bởi vì thứ tự của các phím là sai. Phạm vi giữa '[start_date, 1]' và '[end_date, 1]' sẽ bao gồm rất nhiều thứ bạn không muốn, giống như mọi thứ trong phạm vi ngày cho id sản phẩm = 2. Điều này * sẽ * hoạt động nếu bạn phát ra id sản phẩm trước ngày đó. –

+0

Hehhe! Tôi nghĩ điều này cũng sẽ giúp người khác! :) Bạn đúng, tôi sẽ phải đảo ngược thứ tự quan trọng và sau đó truy vấn xem. Hãy để tôi chỉnh sửa giải pháp. Cảm ơn! –

3

Không thể truy vấn chính xác. Theo tài liệu hướng dẫn, bạn có thể nhận mọi thứ trong một chế độ xem trong một phạm vi khóa cụ thể. Khung nhìn được sắp xếp cấu trúc dữ liệu, vì vậy tất cả các CouchDB làm để thực hiện yêu cầu này là xác định vị trí khóa bắt đầu và bắt đầu trở về các mục cho đến khi bạn nhấn phím kết thúc.

Chiến lược bạn nên sử dụng cho truy vấn này tùy thuộc vào đặc điểm của dữ liệu. Quan trọng nhất, bạn sẽ lãng phí rất nhiều thời gian loại bỏ các mục nếu bạn chỉ sử dụng phần đầu tiên của khóa (logtime) và lặp lại thông qua các phần trong Python, loại bỏ các mục mà product_id sẽ không khớp? Nếu vậy, bạn nên cân nhắc viết một chế độ xem khác chủ yếu được sắp xếp theo product_id. Nếu không, hãy tiếp tục và sử dụng cách tiếp cận cỏ dại.

-1

Làm thế nào về giải pháp này:

  1. tôi có thể tạo một cái nhìn đối với từng sản phẩm với logtime như chỉ số.
  2. Tiếp cận từng xem nếu được yêu cầu và lọc theresults sử dụng phạm vi - [FROMNgày NHCTVN]
  3. Lam sao 3 cho mỗi sản phẩm trong các thông số đầu vào và đối chiếu kết quả

này có một nhược điểm đó cho mỗi sản phẩm chúng tôi sẽ phải tạo chế độ xem và điều này trông giống như quy trình thủ công.

Chỉ là một ý nghĩ! Hãy cho tôi biết quan điểm của bạn.

+0

Nó có thể đơn giản hơn thế.Chỉ cần đảo ngược thứ tự chính của bạn để các tài liệu được sắp xếp đầu tiên theo sản phẩm, sau đó theo thời gian đăng nhập. Truy vấn cùng một chế độ xem ba lần, tìm kiếm từng sản phẩm trong phạm vi thời gian bạn muốn. Đây là gợi ý thứ hai trong câu trả lời tôi đã gửi, vì vậy nếu bạn thích nó, vui lòng đánh dấu là đã chấp nhận :) –

+0

Xin chào, Tôi nên làm thế nào để tìm kiếm từng sản phẩm trong phạm vi thời gian? Tôi nghĩ đây chính xác là câu hỏi tôi đã hỏi. Thực tế là chúng tôi chỉ có thể gửi một ngày hoặc một phạm vi [ngày kết thúc bắt đầu] cho một chế độ xem. Nhưng chúng tôi không thể gửi cả phạm vi và ID sản phẩm cùng một lúc. Tôi đang xem xét sử dụng danh sách chấp nhận bất kỳ số tham số truy vấn nào. Sẽ cung cấp một bản cập nhật. Cảm ơn! –

+0

Bạn có thể tìm phạm vi và ID sản phẩm cùng một lúc. Chế độ xem CouchDB có thể sử dụng các phím tổng hợp và bạn đã đưa ra ví dụ về cách tạo một khóa. Tất cả những gì bạn phải làm là đảo ngược thứ tự khóa của bạn để nó là '[doc.product_id, doc.logtime]'. Để truy vấn nó, hãy sử dụng các phím bắt đầu và các khóa con trong cùng một định dạng hai mục, theo tài liệu bạn đã liên kết đến. –

Các vấn đề liên quan