Tôi hy vọng phần sau sẽ hiểu rõ hơn về mối quan hệ giữa Meteor và Mongo.
Bộ sưu tập sao băng để thoải mái hơn
Meteor cung cấp cho bạn chức năng mongo đầy đủ. Tuy nhiên, để tạo sự thoải mái, nó cung cấp một API được bao bọc của một bộ sưu tập mongo tích hợp tốt nhất với môi trường Meteor. Vì vậy, nếu bạn nhập Mongo qua
import { Mongo } from 'meteor/mongo'
bạn chủ yếu nhập bộ sưu tập mongo được bao bọc nơi các hoạt động được thực thi trong sợi Meteor. Con trỏ được trả về bởi các truy vấn của các tập hợp được bao bọc này cũng không phải là con trỏ "tự nhiên" mà còn là con trỏ con trỏ được bọc để được tối ưu hóa Meteor.
Nếu bạn cố gắng truy cập một tính năng gốc trên các trường hợp không được triển khai này, bạn sẽ nhận được lỗi. Trong trường hợp của bạn:
import { Meteor } from 'meteor/meteor';
import { Random } from 'meteor/random';
const ExampleCollection = new Mongo.Collection('examples')
Meteor.startup(() => {
// code to run on server at startup
ExampleCollection.insert({ value: Random.id() })
const docsCursor = ExampleCollection.find();
docsCursor.readPref('primary')
});
Dẫn đến
TypeError: docsCursor.readPref is not a function
Truy cập bộ sưu tập trình điều khiển nút mongo
Tin tốt là bạn có thể truy cập lớp bên dưới
qua Collection.rawCollection()
nơi bạn có toàn quyền truy cập vào trình điều khiển nút Mongo. Điều này là do Mongo.Collection
của Meteor và đó là Cursor
cuối cùng đang sử dụng trình điều khiển gốc này.
Bây giờ bạn sẽ tìm thấy hai vấn đề khác:
-
readPref
được đặt tên trong con trỏ nút-mongo cursor.setReadPreference (3.1 API). -
Cursor.fetch
không tồn tại nhưng được đặt tên làcursor.toArray
mà (như nhiều thao tác gốc thực hiện) trả về một Lời hứa
Vì vậy, để cuối cùng trả lời câu hỏi của bạn
bạn có thể làm như sau:
import { Meteor } from 'meteor/meteor';
import { Random } from 'meteor/random';
const ExampleCollection = new Mongo.Collection('examples')
Meteor.startup(() => {
// code to run on server at startup
ExampleCollection.insert({ value: Random.id() })
const docsCursor = ExampleCollection.rawCollection().find();
docsCursor.setReadPreference('primary')
docsCursor.toArray().then((docs) => {
console.log(docs)
}).catch((err)=> console.error(err))
});
Tóm tắt
-
Bằng cách sử dụng
collection.rawCollection()
bạn có quyền truy cập vào toàn bộ phổ của API trình điều khiển nút mongo -
Bạn tự mình tích hợp các thao tác, con trỏ và kết quả (Lời hứa) vào môi trường của mình. Những người trợ giúp tốt là Meteor.bindEnosystem và Meteor.wrapAsync
-
Cẩn thận với các thay đổi API của trình điều khiển node-mongo. Một mặt là phiên bản mongo được trình điều khiển hỗ trợ, mặt khác là phiên bản trình điều khiển được Meteor hỗ trợ.
-
Lưu ý rằng việc "làm rối" mọi thứ với API gốc sẽ dễ dàng hơn nhưng nó cũng cung cấp cho bạn rất nhiều tùy chọn mới. Sử dụng cẩn thận.