Надявам се, че следното дава по-добро разбиране на връзката между Метеор и Монго.
Колекции от метеори за повече комфорт
Meteor ви предоставя пълната монго функционалност. За удобство обаче предоставя опакован API на монго колекция, която се интегрира най-добре със средата на Meteor. Така че, ако импортирате Mongo чрез
import { Mongo } from 'meteor/mongo'
вие основно импортирате обвитата колекция mongo, където операциите се изпълняват във влакно Meteor. Курсорът, който се връща от заявки на тези опаковани колекции, също не са „естествените“ курсори, но и обвити курсори да бъде оптимизиран за Meteor.
Ако се опитате да получите достъп до естествена функция на тези екземпляри, която не е внедрена, ще получите грешка. Във вашия случай:
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')
});
Води до
TypeError: docsCursor.readPref is not a function
Достъп до колекциите драйвери на node mongo
Добрата новина е, че имате достъп до слоя отдолу
чрез Collection.rawCollection()
където имате пълен достъп до драйвера на възел Mongo. Това е така, защото под капака на Meteor е Mongo.Collection
и това е Cursor
в крайна сметка използват този естествен драйвер.
Сега ще намерите два други проблема:
-
readPref
е именуван в node-mongo курсор cursor.setReadPreference (3.1 API). -
Cursor.fetch
не съществува, но се наричаcursor.toArray
което (както правят много собствени операции) връща Promise
За да отговоря най-накрая на въпроса ви
можете да направите следното:
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))
});
Резюме
-
Чрез използване на
collection.rawCollection()
вие имате достъп до пълния спектър от API на node mongo драйвер -
Вие сте сами, за да интегрирате операциите, курсорите и резултатите (обещанията) във вашата среда. Добри помощници са Meteor.bindEnvironment и Meteor.wrapAsync
-
Пазете се от промени в API на драйвера node-mongo. От една страна версията mongo, която се поддържа от драйвера, от друга страна версията на драйвера, която се поддържа от Meteor.
-
Обърнете внимание, че е по-лесно да "объркате" нещата с естествения API, но също така ви дава много нови опции. Използвайте внимателно.