Mongoid hay MongoMapper? [đóng cửa]


83

Tôi đã thử MongoMapper và nó đã hoàn thiện về tính năng (cung cấp gần như tất cả chức năng AR) nhưng tôi không hài lòng lắm với hiệu suất khi sử dụng bộ dữ liệu lớn. Có ai so sánh với Mongoid? Có tăng hiệu suất không?

Câu trả lời:


49

Tôi đã sử dụng MongoMapper một thời gian nhưng quyết định chuyển sang MongoId. Lý do là các vấn đề tiềm ẩn cộng với sự kiêu ngạo đối với người dùng. Tôi đã phải nhảy qua các vòng để MongoMapper hoạt động với Cucumber (cuối cùng đã thành công) và đặt một vài bản vá ngay cả khi dự án rất đơn giản, nhưng không phải là vấn đề. Khi tôi cố gắng gửi một bản sửa lỗi (do không tương thích với ActiveRecord), họ dường như đã bực mình vì tôi đã tìm thấy sự cố và tôi đã bị đẩy đi. Trong khi tôi đang thử nghiệm, tôi cũng gặp phải một lỗi lớn với việc triển khai truy vấn của họ, trong khi thử nghiệm của họ được điều chỉnh theo cách mà các thử nghiệm vượt qua. Sau kinh nghiệm lần trước của tôi, không dám nộp nó.

Họ có số lượng yêu cầu kéo và gửi lỗi / tính năng thấp hơn đáng kể so với MongoId, tức là sự tham gia của cộng đồng thấp hơn nhiều. Kinh nghiệm giống như của tôi?

Tôi không biết cái nào có nhiều tính năng hơn ngay bây giờ, nhưng tôi không thấy nhiều tương lai trong MongoMapper. Tôi không ngại tự mình khắc phục các sự cố và thêm chức năng, nhưng tôi lo lắng khi họ không sửa lỗi.


Tôi có thể hỏi bạn, lỗi chính trong triển khai truy vấn là gì. Tôi đã sử dụng mongomapper trong một dự án trước đây, nhưng đó cũng là lần đầu tiên tôi tiếp xúc với mongo. Mọi thông tin về các vấn đề cụ thể với mongomapper mà bạn có sẽ rất tuyệt. Cảm ơn
Red

5
Khi nhận đầu tiên () mà không cần sắp xếp, nó hoạt động như cuối cùng () thay thế (hoặc ngược lại). Nhưng bài kiểm tra đơn vị được viết theo cách mà nó chỉ định thứ tự, vì vậy nó vượt qua. Có thể nó đã được sửa ngay bây giờ, nhưng tôi không sử dụng MongoMapper nữa. Nhưng tôi nghi ngờ điều đó, tôi đã thấy cách nó được triển khai, và đó là một thiết kế tồi.
Aynat

Xin chào, bạn có thể gửi liên kết để biết thông tin về cách di chuyển dễ dàng từ mongo mapper sang mongoid không?
Chen Kinnrot

1
@Aynat Tôi không sửa được nó nhưng tôi đã thử nó cho kết quả tương tự
Viren 22/10/12

Cảm ơn Chúa, tôi thấy cuộc trò chuyện này chỉ là quyết định sử dụng mongomapper hoặc mongoid trong dự án lớn tiếp theo của tôi. Đoán Mongoid thắng.
aliirz,

39

tôi đã sử dụng cả hai trong vài tuần qua. Mongomapper hỗ trợ tốt hơn cho các liên kết quan hệ (không nhúng) và có sự hỗ trợ của bên thứ ba nhiều hơn. Mongoid có hỗ trợ truy vấn tốt hơn, tài liệu tốt hơn nhiều (MM gần như không có, mặc dù một trang web được cho là đang hoạt động), hỗ trợ Rail 3 (và do đó hỗ trợ Devise) và một cộng đồng tích cực hơn một chút trên Google Groups.

Tôi đã kết thúc với Mongoid.


27
Kể từ khi tôi viết câu trả lời này ban đầu, Mongoid đã nhận được rất nhiều sự hỗ trợ của bên thứ ba và sự khác biệt trong cộng đồng thậm chí còn lớn hơn. Theo tôi Mongoid ngày nay là một lựa chọn rõ ràng hơn. Hiệu suất phải tương đối giống nhau vì cả hai đều đi qua trình điều khiển Ruby. Mặc dù bạn cần phải cẩn thận với OM để không tạo ra các tài liệu khủng khiếp.
Nader

Nhiều-nhiều được chia MongoMapper của: github.com/jnunemaker/mongomapper/pull/259 , github.com/jnunemaker/mongomapper/issues/488 1 cho Mongoid
Yevgeniy

37

Sự khác biệt

MongoMapper

  • Tuyên bố có hỗ trợ tốt hơn cho các hiệp hội quan hệ.
  • Được tuyên bố là có thể mở rộng hơn vì nó có kiến ​​trúc plugin.
  • Sử dụng DSL để truy vấn.
  • Các liên kết nhiều đến nhiều chỉ được cập nhật một chiều trong MongoMapper.
  • Hỗ trợ ít mạnh mẽ hơn cho các tài liệu nhúng. Cập nhật toàn bộ mô hình ngay cả khi chỉ sửa đổi một số thuộc tính.

Mongoid

  • Được đề xuất là nhanh hơn MongoMapper bởi bằng chứng giai thoại.
  • Hỗ trợ mạnh mẽ hơn cho các tài liệu nhúng, sử dụng các phép toán nguyên tử MongoDB ($ set, $ push, $ pull, v.v.) để cập nhật các tài liệu lồng nhau tại chỗ.
  • Hỗ trợ kết hợp nhiều-nhiều hai chiều.
  • Sử dụng cú pháp giống ARel có thể phân tích để truy vấn.

Điểm tương đồng

  • Cả MongoMapperMongoid đều có các trang web với tài liệu tốt. MongoMapper từ lâu đã được cho là có tài liệu xấu, nhưng trang web mới của họ dường như đã thu hẹp khoảng cách.
  • Cả hai đều có thể được định cấu hình thông qua tệp YAML và cả hai đều có trình tạo đường ray cho tệp đó.
  • Cả hai đều hoàn toàn tương thích với Rails 3.

Cấu hình

MongoMapper

defaults: &defaults
  host: 127.0.0.1
  port: 27017

development:
  database: database_name

Mongoid

development:
  sessions:
    default:
      database: database_name
      hosts:
        - 127.0.0.1:27017

Thư viện bên thứ 3

Cả hai bên đều tuyên bố có sự hỗ trợ của bên thứ 3 tốt hơn. Github tiết lộ những điều sau:

  • Tìm kiếm "Mongoid" cho ra 12671 kết quả.
  • Tìm kiếm "MongoMapper" cho ra 4708 kết quả.

Đáng chú ý, Devise không hỗ trợ MongoMapper.

Hoạt động cam kết

Trong năm qua, có vẻ như Mongoid đã được bảo trì và cập nhật thường xuyên hơn MongoMapper.

MongoMapper

MongoMapper

Mongoid

Mongoid


1
Mongoid hiện hỗ trợ bản đồ nhận dạng.
user2503775

9

Một điểm khác biệt mà tôi tìm thấy là update_attributetrong MongoMapper dường như viết toàn bộ tài liệu, bất kể thuộc tính nào thực sự đã thay đổi. Trong Mongoid, nó chỉ ghi các thuộc tính đã thay đổi. Đây có thể là một vấn đề hiệu suất đáng kể đối với các bản ghi lớn. Điều này đặc biệt đúng đối với các tài liệu nhúng (tại đây labels), ví dụ:

profile = Profile.find(params[:id])
label = profile.labels.find_or_create_by(idx: params[:idx])
# MongoMapper doesn't have find_or_create_by for embedded docs
# -- you'll have to write custom code
profile.save

Khi bật save, MongoMapper sẽ lưu toàn bộ profilebản ghi, nhưng MongoId sẽ sử dụng $settoán tử với logic vị trí để chỉ cập nhật nhãn đã thay đổi.

Một vấn đề khác là chọn trường nào để trả về. Cả hai đều hỗ trợ một onlytiêu chí, nhưng Mongoid cũng hỗ trợ một withouttiêu chí, vốn được Mongo hỗ trợ.

Đối với tôi, có vẻ như Mongoid chỉ "tròn trịa" và hoàn thiện hơn trong API của nó, điều này có thể giải thích rằng đó là một cơ sở mã lớn hơn. Nó cũng xuất hiện tốt hơn.


7

Bạn đã cài đặt mongo_ext? Tôi nghĩ rằng hiệu suất liên quan đến trình điều khiển nhiều hơn là bản thân người lập bản đồ. Khi nhìn vào nhật ký mongo, tôi có thể thấy mà không có phần mở rộng, bộ chuyển đổi dường như có một số độ trễ.

Cũng làm như họ đề xuất trên trang monogdb, chỉ chọn những trường bạn cần.


Trình điều khiển ruby ​​không nhanh, đặc biệt là 1.8 nhưng 1.9 chỉ tăng hiệu suất! Tôi chỉ đang tự hỏi liệu mongoid có được tối ưu hóa hơn không hay điều duy nhất mà nó cung cấp là một cách tiếp cận khác để phân loại và công cụ vào thời điểm hiện tại mongomapper gần như đã hoàn thiện về tính năng cung cấp hầu như tất cả đường AR
PanosJee

1
Lưu ý cho những người đọc điều này hơn một năm sau: mongo_extkhông cần thiết nữa và đã được cuộn thành mongoviên ngọc cơ bản .
tkrajcar

4

Đã thực hiện một số thử nghiệm với MongoMapper vào tuần trước, nó ổn định nhưng tôi thấy giao diện truy vấn hơi hạn chế (một số logic AR cũng kỳ quặc), hôm nay đã chuyển sang Mongoid và cảm thấy sử dụng tốt hơn nhiều - và trực quan hơn nếu bạn đã quen sang AR.

Chưa có kết luận về tốc độ - nhưng việc chuyển đổi không hề dễ dàng - nó cũng hoạt động với Rails 3.


4

Nếu bạn đang sử dụng Rails3, tôi khuyên bạn nên dùng Mongoid - nó cũng sử dụng "bao gồm" thay vì kế thừa "<" để duy trì các lớp - sử dụng "bao gồm" là mô hình tốt hơn trong Ruby để thêm tính bền bỉ. Mongoid hoạt động tốt với tôi với Devise.

Để cải thiện hiệu suất, hãy cố gắng sử dụng có chọn lọc quyền truy cập cấp thấp hơn, chẳng hạn như Moped - Tôi đã thấy điều này nhanh hơn tới 10 lần


3

Tôi đã sử dụng cả hai và chúng sắp bằng nhau về chức năng, nhưng hãy nhìn vào số liệu thống kê mã Mongoid vs MongoMapper

Có vẻ như MongoMapper có chất lượng mã tốt hơn nhiều (nếu nó làm như vậy với ít hơn).

Bạn có thể tự mình tính toán số liệu thống kê này, đây là công cụ phân tích https://github.com/alexeypetrushin/code_stats


12
Điểm mấu chốt: 'nếu nó cũng làm như vậy với ít' ...
tkrajcar

10
Điều này dường như hoàn toàn không có cơ sở.
Jim Mitchener

14
So sánh chất lượng mã của một dự án thông qua kích thước mã giống như so sánh chất lượng của 2 xe ô tô bằng cách đo trọng lượng.
Patrizio Rullo

3
Trên thực tế, việc so sánh trọng lượng của những chiếc ô tô là hoàn toàn hợp lệ - Bạn có thể đưa ra nhiều phán đoán - tốc độ của nó như thế nào, tốn bao nhiêu xăng, v.v. Và, thực sự nó có ý nghĩa từ quan điểm khoa học, hãy nhìn vào "độ phức tạp Kolmogorov".
Alex Craft

1
Tuy nhiên, một số altough đã được cải thiện đáng kể tốc độ mongomapper của ( coffeepowered.net/2013/07/29/... ), người ta vẫn biết đến và chấp nhận rằng mongoid là nhanh hơn.
Adit Saxena

3

Tôi nghĩ Mongoid tốt hơn nhiều về cấu hình và ánh xạ.


1
Tôi cũng nghĩ thế. Bên cạnh đó, nó có cảm giác gần gũi với NoSQL hơn MongoMapper khiến bạn suy nghĩ nhiều hơn về ActiveRecord và do đó là SQL. Một điểm cộng khác là tài liệu tuyệt vời
PanosJee 13/09/10

Vâng! Trang web Mongoid đá với tài liệu!
rodrigoalvesvieira 13/09/10

0

Tôi mong đợi hiệu suất vẫn như cũ, lần trước tôi đã kiểm tra MongoMapper thiếu hỗ trợ Rails 3 - vì vậy tôi đang xem xét Mongoid bây giờ.


0

sudo gem install mongo_ext là chìa khóa để đạt được hiệu suất.

MongoDB đánh bại CouchDB về tốc độ thô - mặc dù CDB có những ưu điểm riêng.

Điểm chuẩn: http://www.snailinaturtleneck.com/blog/?p=74


Anh ấy đang nói về mongoid x mongo_mapper, đâu là viên ngọc ruby ​​nhanh hơn để truy cập mongo, không phải mongodb x couchdb.
Victor Rodrigues

8
Lưu ý cho những người đọc điều này hơn một năm sau: mongo_extkhông cần thiết nữa và đã được cuộn thành mongoviên ngọc cơ bản .
tkrajcar

0

Devise không hỗ trợ MongoMapper và tôi cũng thích di chuyển theo cách Rails3 hơn. Vì vậy, tôi chuyển sang mongoid.


Tôi nghĩ MM hiện đang hỗ trợ nó.
user2503775


0

Tôi hy vọng Điểm dưới đây bổ sung giá trị cho các câu trả lời trên.

1.Mongoid hoàn toàn tương thích với Rails 3 và sử dụng ActiveModel ở khắp mọi nơi (xác thực, tuần tự hóa, v.v.), trong đó MongoMapper vẫn tập trung vào Rails 2 và sử dụng gem có thể xác thực để xác nhận.

2.Mongoid chính thức hỗ trợ và hoạt động trên đầu Ruby 1.8.7, 1.9.1 và 1.9.2.

3.Mongoid hỗ trợ các tài liệu nhúng mạnh mẽ hơn, thực hiện các hoạt động nguyên tử MongoDB trên bất kỳ khu vực nào của hệ thống phân cấp trong nội bộ. ($ set, $ push, $ pull, v.v.). Với MM, bạn cần yêu cầu nó thực hiện các thao tác này một cách rõ ràng.

4.MongoMapper có hỗ trợ kết hợp quan hệ tốt hơn và hoạt động như thế này như mặc định.

5.MongoMapper có thể mở rộng hơn, với kiến ​​trúc plugin giúp mọi người khá dễ dàng mở rộng nó với các thư viện của riêng họ. Mongoid không có điều này.

6.MM hỗ trợ bản đồ nhận dạng, Mongoid thì không.

7.MM có một cộng đồng lớn hơn, và có lẽ nhiều hỗ trợ thư viện của bên thứ 3 hơn. Tôi đã phát điên với tài liệu và rdoc.

8.Mongoid hỗ trợ các cụm sao chép Master / Slave. (Viết để làm chủ, đọc round robin cho nô lệ) MM không.

9.Mongoid có API tiêu chí kiểu ARel cực kỳ phong phú, MM sử dụng công cụ tìm kiểu AR2.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.