Jeg håber, at følgende giver en bedre forståelse af forholdet mellem Meteor og Mongo.
Meteorsamlinger for mere komfort
Meteor giver dig den fulde mongo-funktionalitet. Men for komfort giver den en indpakket API af en mongo-kollektion, der bedst integreres med Meteor-miljøet. Så hvis du importerer Mongo via
import { Mongo } from 'meteor/mongo'
du importerer primært den indpakkede mongo-samling, hvor operationer udføres i en Meteor-fiber. Markøren, der returneres af forespørgsler fra disse indpakkede samlinger, er heller ikke de "naturlige" markører, men også omviklede markører at blive Meteor-optimeret.
Hvis du forsøger at få adgang til en indbygget funktion på disse forekomster, som ikke er implementeret, vil du modtage en fejl. I dit tilfælde:
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')
});
Fører til
TypeError: docsCursor.readPref is not a function
Adgang til node mongo-driversamlinger
Den gode nyhed er, du kan få adgang til laget nedenunder
via Collection.rawCollection()
hvor du har fuld adgang til node Mongo-driveren. Dette skyldes, at under motorhjelmen Meteors Mongo.Collection
og det er Cursor
gør brug af denne native driver i sidste ende.
Nu vil du finde to andre problemer:
-
readPref
er navngivet i en node-mongo-markør cursor.setReadPreference (3.1 API). -
Cursor.fetch
eksisterer ikke, men heddercursor.toArray
som (som mange indfødte operationer gør) returnerer et løfte
Så for endelig at besvare dit spørgsmål
du kan gøre følgende:
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))
});
Oversigt
-
Ved at bruge
collection.rawCollection()
du har adgang til hele spektret af node mongo driver API -
Du er på egen hånd til at integrere operationer, markører og resultater (løfter) i dit miljø. Gode hjælpere er Meteor.bindEnvironment og Meteor.wrapAsync
-
Pas på API-ændringer af node-mongo-driveren. På den ene side mongoversionen, der understøttes af driveren, på den anden side driverversionen, der understøttes af Meteor.
-
Bemærk, at det er nemmere at "rode" ting med den native API, men det giver dig også en masse nye muligheder. Brug med omhu.