Ik hoop dat het volgende een beter begrip geeft van de relatie tussen Meteor en Mongo.
Meteor-collecties voor meer comfort
Meteor biedt u de volledige mongo-functionaliteit. Voor het gemak biedt het echter een verpakte API van een mongo-collectie die het beste integreert met de Meteor-omgeving. Dus als je Mongo importeert via
import { Mongo } from 'meteor/mongo'
je importeert voornamelijk de verpakte mongo-collectie waar bewerkingen worden uitgevoerd in een Meteor-vezel. De cursor die wordt geretourneerd door query's van deze verpakte collecties zijn ook niet de "natuurlijke" cursors, maar ook verpakte cursors meteoor geoptimaliseerd zijn.
Als u op deze instanties probeert toegang te krijgen tot een native functie die niet is geïmplementeerd, ontvangt u een foutmelding. In jouw geval:
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')
});
Leidt naar
TypeError: docsCursor.readPref is not a function
Toegang tot de verzamelingen van node mongo-stuurprogramma's
Het goede nieuws is:je hebt toegang tot de onderliggende laag
via Collection.rawCollection()
waar u volledige toegang hebt tot het knooppunt Mongo-stuurprogramma. Dit komt omdat onder de motorkap Meteor's Mongo.Collection
en het is Cursor
maken uiteindelijk gebruik van deze native driver.
Nu vindt u nog twee andere problemen:
-
readPref
wordt genoemd in een node-mongo-cursor cursor.setReadPreference (3.1 API). -
Cursor.fetch
bestaat niet maar heetcursor.toArray
die (zoals veel native bewerkingen doen) een belofte retourneert
Dus om eindelijk je vraag te beantwoorden
je kunt het volgende doen:
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))
});
Samenvatting
-
Door
collection.rawCollection()
. te gebruiken je hebt toegang tot het volledige spectrum van de node mongo driver API -
U integreert zelf de bewerkingen, cursors en resultaten (Promises) in uw omgeving. Goede helpers zijn Meteor.bindEnvironment en Meteor.wrapAsync
-
Pas op voor API-wijzigingen van de node-mongo-driver. Enerzijds de mongo-versie die door de driver wordt ondersteund, anderzijds de driverversie die door Meteor wordt ondersteund.
-
Merk op dat het gemakkelijker is om dingen te "verpesten" met de native API, maar het geeft je ook veel nieuwe opties. Wees voorzichtig.