2015-05-08 17 views
9

Gần đây tôi đang đi sâu vào MongoDB và tôi đang tự hỏi về các thủ tục JavaScript được lưu trữ. Sau khi đọc Blog Entry từ PointBeing, tôi có một số câu hỏi.Các thủ tục JavaScript được lưu trữ MongoDB có nhanh hơn không?

  • Đây có phải là lợi thế thực sự để lưu trữ mã của tôi trong DB không? Tôi có nghĩa là các chức năng như lookups for documents, không phải adding numbers như ví dụ từ PointBeing.
  • Mã JavaScript có tiếp cận nhanh hơn từ phía node.js không?
  • Nếu truy vấn của tôi được lưu trữ trong Cơ sở dữ liệu, là bộ nhớ cache (và nhanh hơn)?

Tôi đang tìm kiếm từ điểm phát triển node.js.

+2

Giữ một câu hỏi cho mỗi bài đăng. SO không cho phép hỏi 4 câu hỏi cùng một lúc. –

+3

@Salvador Những câu hỏi này đều liên quan chặt chẽ, tôi thấy ít điểm trong việc chia nhỏ chúng thành ba bài viết riêng biệt. – deceze

+1

1: Không, 2: Không, 3: Tất nhiên không phải – Sammaye

Trả lời

13

Đánh giá chức năng lưu trữ trong db.system.js ("thủ tục lưu trữ", khi bạn muốn gọi cho họ đó) bị phản đối. Các bài viết trên db.eval shell functionthe eval database command có cảnh báo "Không được chấp nhận kể từ phiên bản 3.0" và the article on server-sided javascript không đề cập đến nó nữa. Vì vậy, bạn nên tránh sử dụng nó. Một lý do là bạn không thể chạy một hàm javascript khi bạn sử dụng sharding. Vì vậy, khi bạn xây dựng một ứng dụng yêu cầu eval, bạn ngăn không cho nó mở rộng trong tương lai. Khác là chức năng javascript làm suy yếu khái niệm quyền. Họ luôn luôn cần phải được chạy như admin, mà làm cho nó không thể thiết lập một hệ thống cho phép sane. Điều này đặc biệt có vấn đề từ quan điểm bảo mật khi xem xét các kịch bản lệnh phía máy chủ sử dụng dữ liệu do người dùng cung cấp có thể dễ bị tấn công bởi các đoạn mã script tùy ý.

Lợi thế của javascript phía máy chủ là nó chạy trên máy chủ cơ sở dữ liệu. Điều này làm giảm độ trễ giữa máy chủ ứng dụng và máy chủ cơ sở dữ liệu khi bạn cần thực hiện một số lượng lớn các truy vấn. Nhưng bạn có thể có được lợi thế tương tự bằng cách mở một trình bao mongo trên máy chủ cơ sở dữ liệu và thực hiện nó ở đó.

Lợi thế thời gian chờ chỉ có liên quan khi bạn thực hiện nhiều truy vấn từ tập lệnh của mình. Khi bạn chỉ có một truy vấn, bạn sẽ vẫn có độ trễ khi gọi tập lệnh. Vì vậy, bạn không đạt được gì ngoại trừ sự phức tạp không cần thiết.

Không có bộ nhớ đệm bổ sung hoặc tối ưu hóa khác cho javascript phía máy chủ.Thậm chí tệ hơn: Nó sẽ nhận được reparsed và reinterpreted mỗi khi bạn chạy nó. Vì vậy, nó thậm chí có thể chậm hơn so với javascript trong máy chủ ứng dụng của bạn.

Hơn nữa, nhiều truy vấn phức tạp mà sẽ yêu cầu hỗ trợ kịch bản để thực hiện chỉ với find() thường có thể được thể hiện bằng aggregation mà sẽ ở hầu hết các trường hợp được xa nhanh hơn so với làm việc cùng với find() và javascript vì khuôn khổ tập hợp được thực hiện trong C++ và có quyền truy cập vào tài liệu BSON thô.

+0

Khó triển khai các truy vấn bằng cách sử dụng API MongoDB C# Phiên bản Trình điều khiển 1.7.0.4714 khi truy vấn liên quan đến rất nhiều sự tham gia bán giữa các Bộ sưu tập MongoDB. Tôi tin rằng nó làm chậm hiệu năng nếu bạn mang một lượng lớn dữ liệu từ thế giới MongoDB vào thế giới C# như các đối tượng POCO trong một danh sách. Vì vậy, tôi đã suy nghĩ nếu nó sẽ là tốt để áp dụng thực hành thực hiện của việc sử dụng C# để gọi JavaScript được lưu trữ trong MongoDB. Bạn đang nói đang gọi JavaScript được lưu trữ là xấu. Vui lòng xem: http://stackoverflow.com/questions/36220272/c-sharp-invocation-of-stored-javascript-in-mongodb-vs-mongodb-c-sharp-driver-ver –

+0

@CSLewis Khi bạn cần làm rất nhiều quasi-join, sau đó rất có thể bạn đang sử dụng mongodb như một cơ sở dữ liệu quan hệ, mà hiếm khi mang lại cho bạn kết quả tốt. – Philipp

+0

ok, nhưng, điều gì sẽ xảy ra nếu tôi chỉ thực hiện một số lượng lớn phân tích trên một bộ sưu tập với một lượng lớn dữ liệu. Tôi nghĩ rằng nó sẽ là hiệu suất chậm bằng cách đưa vào rất nhiều tài liệu từ bộ sưu tập như C# POCO đối tượng trong thế giới C#. Thay vào đó, tôi nghĩ rằng nó sẽ tốt hơn nếu C# gọi JavaScript đã lưu trữ sẽ thực hiện rất nhiều phân tích chuyên sâu, và sau đó trả về kết quả cuối cùng cho thế giới C#. Tôi có lựa chọn thay thế nào khác? –

3

Điều thú vị là bài đăng trên blog (http://pointbeing.net/weblog/2010/08/getting-started-with-stored-procedures-in-mongodb.html) được viết khi JS chỉ lấy khóa toàn cầu có ren.

Điều đó có nghĩa là không có tính năng tiền tệ hoặc khóa chi tiết hơn được liên kết với nó (khóa vẫn là vấn đề và đồng tiền chỉ đạt được thông qua nhiều cách ly). Chỉ vì bạn thấy nó trong một số bài đăng blog ngẫu nhiên không có nghĩa là nó nên được sử dụng.

Để trả lời câu hỏi của bạn trực tiếp:

  1. Nope. Trong thực tế, bất lợi là người dùng gọi cần quyền quản trị đầy đủ. Điều này có nghĩa là bạn cung cấp cho mỗi đặc quyền duy nhất cho người dùng web của bạn kể từ khi enigne JS sẵn có có móc cho tất cả mọi thứ, bao gồm các chức năng quản trị như vậy nó yêu cầu quyền quản trị để chạy.

  2. Gọi JS từ JS sang JS thành C++ trong JS? Không

  3. Không, bộ nhớ đệm MongoDB không hoạt động như thế. Tôi khuyên bạn nên đọc tài liệu nguyên tắc cơ bản: http://docs.mongodb.org/manual/faq/fundamentals/

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