Khi bạn hỏi về khả năng tồn tại của javascript phía máy chủ, trước tiên bạn phải nói rõ bạn đang nói về loại javascript phía máy chủ nào. Theo tài liệu , có bốn kiểu thực thi mã phía máy chủ khác nhau. Thật không may, tất cả chúng đều là những cách giải quyết hackish cho các tình huống mà API gốc không đủ:
eval lệnh
eval có nhược điểm là nó chỉ chạy trên một nút. Điều này làm giảm đáng kể tính hữu dụng của nó trong môi trường được phân nhóm. Với các bộ sưu tập được chia nhỏ, nó hoàn toàn không hoạt động!
Theo mặc định, nó cũng tạo ra một khóa toàn cục làm cho cơ sở dữ liệu hoàn toàn không thể sử dụng được cho đến khi tập lệnh chạy. Điều này có thể được ngăn chặn bằng nolock
đối số (trừ khi bản thân tập lệnh thực hiện điều gì đó tạo ra khóa toàn cục).
Câu trả lời của Sammaye cũng giải thích một số lo ngại nghiêm trọng về bảo mật.
Nó thực sự giống một công cụ kiểm tra và quản trị hơn là thứ bạn nên sử dụng cho bất kỳ hoạt động thông thường nào.
Chạy tệp .js qua Phiên bản trình bao mongo trên Máy chủ
Trong trường hợp này, mã không được thực thi trên cơ sở dữ liệu mà là trên một quy trình độc lập khác trên một trong các máy chủ. Điều này có nghĩa là tất cả dữ liệu bắt buộc từ các phân đoạn khác phải được chuyển đến máy chủ chạy mã javascript, bất kể điều gì thực sự được tập lệnh trả về.
Nó xuất hiện như một ứng dụng khác đối với máy chủ mongodb, vì vậy nó không thể làm bất cứ điều gì mà bạn cũng không thể làm từ bên trong ứng dụng thông thường của mình. Đó là một công cụ quản trị và kiểm tra khác mà bạn không nên sử dụng trong hoạt động thường xuyên.
Tìm bằng $ ở đâu -người điều hành
Toán tử $ where trong lệnh tìm cho phép chuyển một hàm javascript được sử dụng để lọc các giá trị. Đối với hầu hết các trường hợp nhỏ, điều này có hiệu suất kém hơn rất nhiều so với những gì mà các công cụ khác của truy vấn tìm phải cung cấp, đặc biệt là vì nó không thể sử dụng bất kỳ chỉ số nào.
Khi không thể tránh được việc sử dụng $ where, ít nhất hãy thử sử dụng một số công cụ bình thường của truy vấn tìm kiếm để giảm bớt tập hợp các tài liệu cần được chuyển đến hàm $ where.
MapReduce
MapReduce sử dụng hai hàm javascript để tạo dữ liệu tổng hợp. Nó từng là công cụ khai thác dữ liệu chính cho MongoDB, nhưng hầu hết các trường hợp sử dụng thông thường của nó hiện đã được đáp ứng bởi khung tổng hợp .
Nó cũng có nhược điểm tương tự như $ ở chỗ:Trừ khi bạn lọc, bạn sẽ phải chạy không phải một mà ít nhất hai hàm javascript cho mỗi tài liệu.
Nhưng MapReduce ít nhất có thể chạy được phân phối và nó có thể được chạy song song.
tl; dr:
Sử dụng Javascript là biện pháp cuối cùng cho các truy vấn rất bất thường không thể thực hiện bằng ngôn ngữ truy vấn thông thường và yêu cầu quyền truy cập vào quá nhiều dữ liệu được triển khai trong ứng dụng. Khi có thể, hãy làm những gì bạn muốn bằng các công cụ chuyên dụng mà bạn có sẵn hoặc triển khai logic của bạn trên lớp ứng dụng.