Doufám, že následující poskytne lepší pochopení vztahu mezi Meteorem a Mongo.
Meteorické kolekce pro větší pohodlí
Meteor vám poskytuje všechny funkce mongo. Pro pohodlí však poskytuje zabalené API z kolekce mongo, která se nejlépe integruje s prostředím Meteor. Pokud tedy importujete Mongo přes
import { Mongo } from 'meteor/mongo'
primárně importujete zabalenou kolekci mongo, kde se operace provádějí ve vláknu Meteor. Kurzor vrácený dotazy těchto zabalených kolekcí také nejsou „přirozené“ kurzory, ale také zabalené kurzory být optimalizován pro meteorologii.
Pokud se v těchto instancích pokusíte o přístup k nativní funkci, která není implementována, zobrazí se chyba. Ve vašem případě:
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')
});
Vede k
TypeError: docsCursor.readPref is not a function
Přístup ke sbírkám ovladačů node mongo
Dobrou zprávou je, že můžete přistupovat k vrstvě pod ní
přes Collection.rawCollection()
kde máte plný přístup k ovladači uzlu Mongo. Je to proto, že pod kapotou Meteor je Mongo.Collection
a je to Cursor
nakonec využívají tento nativní ovladač.
Nyní najdete dva další problémy:
-
readPref
je pojmenován v node-mongo kurzoru cursor.setReadPreference (3.1 API). -
Cursor.fetch
neexistuje, ale má názevcursor.toArray
který (jako mnoho nativních operací) vrací Promise
Tak abych konečně odpověděl na vaši otázku
můžete provést následující:
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))
});
Shrnutí
-
Pomocí
collection.rawCollection()
máte přístup k celému spektru rozhraní node mongo driver API -
Operace, kurzory a výsledky (Promises) integrujete do svého prostředí sami. Dobrými pomocníky jsou Meteor.bindEnvironment a Meteor.wrapAsync
-
Dejte si pozor na změny API ovladače node-mongo. Na jedné straně mongo verze, kterou ovladač podporuje, na druhé straně verze ovladače, kterou podporuje Meteor.
-
Všimněte si, že s nativním API je snazší věci „pokazit“, ale také vám dává spoustu nových možností. Používejte opatrně.