a

Câu hỏi Lọc và sắp xếp trên nhiều giá trị với Firebase


Tôi đang xây dựng một ứng dụng xã hội bằng Firebase. Tôi lưu trữ các bài đăng trong Firebase như sau:

posts: {
   "postid": {
      author: "userid" 
      text: "",
      date: "timestamp"
      category: "categoryid"
      likes: 23
   }
}

Mỗi bài thuộc về một thể loại và nó có thể thích bài viết.

Bây giờ, tôi đang cố gắng hiển thị các bài đăng thuộc về một danh mục cụ thể, được sắp xếp theo số lượt thích. Có thể tôi cũng muốn giới hạn bộ lọc theo ngày, để chỉ hiển thị các bài đăng mới nhất, được thích nhiều nhất trong một danh mục. Tôi có thể làm cái này như thế nào?

Chức năng truy vấn Firebase dường như không hỗ trợ nhiều truy vấn như thế này, điều này có vẻ lạ ...


11
2017-12-05 11:22


gốc


Xem stackoverflow.com/questions/26700924/… - Kato


Các câu trả lời:


Bạn chỉ có thể sử dụng một hàm đặt hàng với các truy vấn cơ sở dữ liệu Firebase, nhưng cấu trúc dữ liệu thích hợp sẽ cho phép bạn truy vấn theo nhiều trường.

Trong trường hợp của bạn, bạn muốn đặt hàng theo danh mục. Thay vì có danh mục dưới dạng thuộc tính, nó có thể hoạt động như một chỉ mục trong posts:

posts: {
   "categoryid": {
       "postid": {
         author: "userid" 
         text: "",
         date: "timestamp",
         category: "categoryid",
         likes: 23
       }
   }
}

Bây giờ bạn có thể viết một truy vấn để có được tất cả các bài viết bên dưới một thể loại cụ thể.

let postsRef = Firebase(url: "<my-firebase-app>/posts")
let categoryId = "my-category"
let categoryRef = postsRef.childByAppendingPath(categoryId)
let query = categoryRef.queryOrderedByChild("date")
query.observeEventType(.ChildAdded) { (snap: FDataSnapshot!) {
  print(snap.value)
}

Mã ở trên tạo tham chiếu cho các bài đăng theo một danh mục cụ thể và các đơn hàng theo ngày. Truy vấn nhiều có thể bởi cấu trúc dữ liệu. Tính năng đóng lại cuộc gọi sẽ kích hoạt cho từng mục riêng lẻ bên dưới danh mục được chỉ định.

Nếu bạn muốn truy vấn thêm, bạn sẽ phải thực hiện lọc dữ liệu phía máy khách.


11
2017-12-05 12:46



Cảm ơn vi đa trả lơi! Đó là loại có thể làm việc, nhưng tôi đang tiết kiệm tài liệu tham khảo cho các bài viết (chỉ lưu trữ ID của bài viết) ở các địa điểm khác (ví dụ trong nguồn cấp dữ liệu của người dùng, vv). Sử dụng giải pháp bạn đề xuất, sẽ không thể nhận được dữ liệu bài thực tế chỉ sử dụng ID bài đăng, vì tôi cũng sẽ cần ID danh mục, để "xem chi tiết" đến nút chính xác ... Bởi vì theo tôi biết không thể sử dụng ký tự đại diện (*) trong đường dẫn khi truy vấn cơ sở dữ liệu, chẳng hạn như / posts / * / [postid]? - andlin
Dĩ nhiên, một giải pháp là lưu trữ danh mục bài đăng thuộc một nút khác, chẳng hạn như / category_for_post / [postid] / [categoryid] nhưng điều đó có nghĩa là tôi sẽ phải thực hiện truy vấn bổ sung cho thông tin này mỗi khi tôi muốn dữ liệu cho bài đăng. - andlin
@andlin: Có, bạn cũng có thể lưu trữ các danh mục như "thẻ" và tìm kiếm theo các thẻ đó. Bạn vẫn có thể theo cấu trúc ở trên, nhưng gọi nó là /categoryPosts và sau đó lưu trữ tất cả các bài đăng trong posts. Không sao chép dữ liệu vì nó sẽ dẫn đến việc đọc nhanh hơn và bạn có thể giữ cho nó phù hợp với fanout phía máy khách. firebase.com/blog/… - David East
@DavidEast có cách nào để sắp xếp theo lượt thích với phân trang. - iDhaval
Chào mọi người. Theo dõi cấu trúc của David East trên Firebase. Có cách nào để đặt hàng theo lượt thích với phân trang không? Hoặc có cách nào để có được tất cả các bài viết với phân trang? - HuyLe