Lưu ý:Câu hỏi đã thay đổi - hãy xem nội dung cập nhật bên dưới.
Câu trả lời ban đầu:
Có.
Thay vì:
db.tableName.find({ col: 'value' })
Bạn sử dụng nó như là:
db.collection('tableName').find({ col: 'value' }, (err, data) => {
if (err) {
// handle error
} else {
// you have data here
}
});
Xem: http://mongodb.github.io /node-mongodb-native/2.2/api/Collection.html#find
Cập nhật
Sau khi bạn thay đổi câu hỏi của mình và đăng một số nhận xét, bạn sẽ thấy rõ hơn những gì bạn muốn làm.
Để đạt được mục tiêu mô phỏng Mongo shell trong Node, bạn cần phải phân tích cú pháp lệnh do người dùng nhập và thực hiện lệnh thích hợp trong khi lưu ý:
- sự khác biệt giữa SpiderMonkey được sử dụng bởi Mongo shell và Node với V8 và libuv
- sự khác biệt giữa BSON và JSON
- thực tế là trình bao Mongo hoạt động đồng bộ và trình điều khiển Node hoạt động không đồng bộ
Phần cuối cùng có lẽ sẽ là phần khó nhất đối với bạn. Hãy nhớ rằng trong trình bao Mongo, điều này hoàn toàn hợp pháp:
db.test.find()[0].x;
Trong Node, .find()
phương thức không trả về giá trị nhưng nó sẽ nhận một cuộc gọi lại hoặc trả về một lời hứa. Nó sẽ được khó khăn. db.test.find()[0].x;
trường hợp này có thể tương đối dễ xử lý với các lời hứa (nếu bạn hiểu rõ về các lời hứa) nhưng điều này sẽ khó hơn:
db.test.find({x: db.test.find()[0].x});
và hãy nhớ rằng bạn cần xử lý các mức lồng nhau tùy ý.
Giao thức Mongo
Sau khi đọc một số nhận xét, tôi nghĩ rằng điều đáng chú ý là những gì bạn thực sự gửi đến máy chủ Mongo không liên quan gì đến JavaScript mà bạn viết trong Mongo shell. Mongo shell sử dụng SpiderMonkey với một số chức năng và đối tượng được xác định trước.
Nhưng bạn không thực sự gửi JavaScript đến máy chủ Mongo nên bạn không thể gửi những thứ như db.collection.find()
. Thay vì bạn gửi OP_QUERY
nhị phân struct với tên bộ sưu tập được mã hóa dưới dạng chuỗi và truy vấn được mã hóa dưới dạng BSON cộng với một loạt cờ nhị phân. Xem:
Bản thân BSON là một định dạng nhị phân với một số giá trị cấp thấp được xác định là byte:
Điểm mấu chốt là bạn không gửi đến máy chủ Mongo bất kỳ thứ gì giống với những gì bạn nhập trong Mongo shell. Trình bao Mongo phân tích cú pháp những thứ bạn nhập bằng trình phân tích cú pháp SpiderMonkey và gửi yêu cầu nhị phân đến máy chủ Mongo thực tế. Mongo shell sử dụng JavaScript nhưng bạn không giao tiếp với máy chủ Mongo bằng JavaScript.
Ví dụ
Ngay cả đối tượng truy vấn JSON cũng không được gửi đến Mongo dưới dạng JSON. Ví dụ:khi bạn đang tìm kiếm một tài liệu có hello
thuộc tính bằng "world" mà bạn sẽ sử dụng {hello: 'world'}
bằng JavaScript hoặc {"hello": "world"}
trong JSON nhưng đây là những gì được gửi đến máy chủ Mongo - bởi Mongo shell hoặc bởi bất kỳ ứng dụng Mongo nào khác:
\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00
Tại sao nó quá khác biệt
Để hiểu tại sao cú pháp được sử dụng trong Node lại khác với Mongo shell, hãy xem câu trả lời sau: