2012-03-13 28 views
23

Tôi có điều này trong chức năng quan điểm của tôi:couchdb hoặc lọc trên mảng chính

emit([doc.address.country,doc.address.state, doc.address.city], doc); 

Khi tôi truy vấn tìm kiếm, tôi cần phải có tất cả 3 yếu tố của mảng điền vào, ví dụ:

?key=["US","NY","New York"] 

rằng sẽ tạo ra hồ sơ của tôi, nhưng cho phép nói ví dụ, tôi chỉ muốn quay trở lại tất cả mọi thứ ở Mỹ ví dụ:

?key=["US"] 

hoặc ở Mỹ và Nhà nước ...

?key=["US","NY"] 

HOẶC ... cho phép nói có lẽ tôi chỉ muốn tất cả hồ sơ từ NY ... (tôi biết bên dưới có vẻ không hoạt động)

?key=["","NY"] 

Tôi không thực sự tìm cách tìm kiếm nếu bạn muốn để lại một trong các thành phần của mảng trống?

Trả lời

42

Đầu tiên:

key = [ "Mỹ"] sẽ không hoạt động trên một mảng Key [ "Mỹ", "NY"], nguyên nhân bạn đang tìm kiếm một chìa khóa đó là CHÍNH XÁC [ "Mỹ "]. Thay vào đó, bạn phải sử dụng

startkey=["US"]&endkey=["US",{}] 

sau đó những phím đang trong resultset:

["DE","Bavaria","Munich"] <---- NO ! "DE" is out of Range of startkey 
["US","FL","Miami"]   <---- YES, starts with "US" 
["US","NY","New York"]  <---- YES, starts with "US" 
["VE","XX","Vencuela City"] <---- NO ! "VE" is out of Range of endkey 

Cũng làm việc:

startkey=["US","FL"]&endkey=["US","FL",{}] 

kết quả:

["DE","Bavaria","Munich"] <---- NO ! "DE" is out of Range of startkey 
["US","FL","Miami"]   <---- YES, starts with "US","FL" 
["US","NY","New York"]  <---- NO, "US","NY" is out of Range of endkey 
["VE","XX","Vencuela City"] <---- NO ! "VE" is out of Range of endkey 

Thứ hai: Bạn không thể có khoảng trống bên trái .. vì vậy bạn phải viết một số phát ra hơn: (bạn không cần phải phát ra mảng mục thứ hai và thứ ba, nếu bạn không cần phải truy vấn nó)

xem "byStateCityCountry":

emit([doc.address.state, doc.address.city,address.country], doc); 

xem "byCityStateCountry":

emit([address.city,doc.address.state, doc.address.country], doc); 

của chỉ cần đặt một lá cờ ở nơi đầu tiên để xác định loại truy vấn, vì vậy bạn có thể làm tất cả trong một Xem:

emit([1,address.country,doc.address.state, doc.address.city], doc); 
emit([2,doc.address.state, doc.address.city,address.country], doc); 
emit([3,address.city,doc.address.state, doc.address.country], doc); 

Cách sử dụng:

?startkey=[1,"US"]&endkey=[1,"US",{}] 
?startkey=[2,"FL"]&endkey=[2,"FL",{}] 
?startkey=[3,"Miami"]&endkey=[3,"Miami",{}] 
+0

Lưu ý: "Bạn không thể có khoảng trống bên trái ..." - Tôi tin rằng điều ngược lại là đúng nếu bạn đã giảm dần = true – Matt

+2

Tôi biết điều này là cũ, nhưng nó cũng cần lưu ý rằng nếu mảng khóa của bạn có nhiều yếu tố thì phức tạp hơn. giả định dữ liệu sau trong chế độ xem của bạn bằng các phím sau: 'startkey == [a, 11] và endkey == [c, 11]:' '[a, 10], [a, 11] < - startkey, [a, 12], [b, 10], [b, 11], [b, 12], [c, 10], [c, 11] <- endkey, [c, 12] ' (Mọi thứ ở giữa khóa bắt đầu và phím kết thúc sẽ được trả lại.). – AdriVelaz

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