Kể từ MongoDB v2.6 không có loại thập phân có vị trí cố định. Dữ liệu phải được lưu trong một trường thuộc loại khác và ứng dụng phải thực hiện dịch mọi lúc.
Có khả năng các lib trung gian có thể thực hiện bản dịch này thay vì ứng dụng của bạn. Tôi đoán net.liftweb.record thì không.
Nếu một kiểu kép là đủ cho (các) trường được đề cập, tôi khuyên bạn nên thay đổi thành kiểu đó để đơn giản hơn. Nhưng giả sử bạn đang sử dụng BigDecimal vì những lý do chính đáng, thì có những cách giải quyết nổi tiếng. Đây là:
(1) Lưu trữ nó dưới dạng chuỗi . Bạn có thể có bất kỳ độ chính xác tùy ý. Tuy nhiên, việc sắp xếp hoặc truy vấn các kết quả phù hợp giá trị chính xác sẽ chỉ hoạt động nếu bạn luôn luôn đặt phía bên trái bằng các số 0 thành một độ dài cố định. Ngay cả khi đó số dương và số âm là hai phạm vi khác nhau được sắp xếp khôn ngoan. Các phủ định cần được sắp xếp ngược lại để có sự sắp xếp theo số chính xác. Ví dụ về đơn đặt hàng MongoDB sẽ tự nhiên trả về các số chuỗi không có đệm này:
"-0000054321.9876"
"-0000100322"
"0000054321.9876"
"0000100322"
Tôi tin rằng kiểu BigDecimal có hàm tạo từ giá trị chuỗi, vì vậy đây có thể là cách dễ triển khai nhất trong chức năng dịch của ứng dụng của bạn.
(2) Lưu trữ nó dưới dạng một dịch chuyển dài (Int64) . Sắp xếp hoạt động, ít dung lượng đĩa hơn được sử dụng, không có vấn đề với v.s tiêu cực. tích cực. Yêu cầu chuyển các giá trị lên theo một bội số cố định, điều này khiến một chút không thể đọc được khi xem trực tiếp cơ sở dữ liệu. Độ chính xác phải được cố định để giống nhau cho tất cả các giá trị trong toàn bộ bộ sưu tập - OK đối với các trường hợp sử dụng tài chính; không phù hợp với một số trường hợp sử dụng khoa học.
(3) Lưu trữ dưới dạng một cặp số , một cho một trong hai bên của dấu thập phân. Việc sắp xếp đòi hỏi một công việc nhỏ. Nếu sử dụng số Int32, độ chính xác sẽ bị giới hạn ở 9 chữ số ở mỗi bên của số thập phân. Tất nhiên, nhìn vào hai cột trong db thay vì một cột là một công việc nhiều hơn một chút.
Đối với ví dụ về mã Scala, tôi thấy trình điều khiển Reactive cho dự án MongoDB đã được ghi lại ba cách giải quyết tuần tự hóa cho BigDecimal . Đầu tiên sử dụng gấp đôi; hai phương pháp sau thực hiện một cách tiếp cận khác- tạo toàn bộ tài liệu con cho giá trị BigDecimal. Tôi nghi ngờ việc cố gắng truy vấn các giá trị được bao bọc trong các tài liệu con sẽ rất phức tạp.
Khác trường hợp thực tế từ blog của nhóm nhà phát triển Ebay (Morphia / Java)
P.S. có thể MongoDB sẽ thêm kiểu thập phân trong tương lai. Có một yêu cầu tính năng mở cho nó mà bạn có thể xem / upvote - https://jira. mongodb.org/browse/SERVER-1393