Jag hoppas att följande ger en bättre förståelse av förhållandet mellan Meteor och Mongo.
Meteorsamlingar för mer komfort
Meteor ger dig full mongo-funktionalitet. Men för komfort ger den ett omslutet API av en mongokollektion som bäst integrerar med Meteormiljön. Så om du importerar Mongo via
import { Mongo } from 'meteor/mongo'
du importerar i första hand den inslagna mongosamlingen där operationer utförs i en Meteor-fiber. Markören som returneras av frågor från dessa inslagna samlingar är inte heller de "naturliga" markörerna utan också lindade markörer att bli Meteor-optimerad.
Om du försöker få åtkomst till en inbyggd funktion på dessa instanser som inte är implementerad kommer du att få ett felmeddelande. I ditt fall:
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')
});
Leder till
TypeError: docsCursor.readPref is not a function
Åtkomst till samlingarna för nodmongodrivrutiner
Den goda nyheten är att du kan komma åt lagret under
via Collection.rawCollection()
där du har full tillgång till noden Mongo-drivrutinen. Detta beror på att under huven Meteors Mongo.Collection
och det är Cursor
använder den här inbyggda drivrutinen till slut.
Nu kommer du att hitta två andra problem:
-
readPref
namnges i en nod-mongo-markör cursor.setReadPreference (3.1 API). -
Cursor.fetch
existerar inte men hetercursor.toArray
som (som många inhemska operationer gör) returnerar ett löfte
Så för att äntligen svara på din fråga
du kan göra följande:
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))
});
Sammanfattning
-
Genom att använda
collection.rawCollection()
du har tillgång till hela spektrumet av node mongo driver API a> -
Du är på egen hand att integrera verksamheten, markörerna och resultaten (löften) i din miljö. Bra hjälpare är Meteor.bindEnvironment och Meteor.wrapAsync
-
Akta dig för API-ändringar av node-mongo-drivrutinen. Å ena sidan mongoversionen som stöds av föraren, å andra sidan drivrutinsversionen som stöds av Meteor.
-
Observera att det är lättare att "röra till" saker med det inbyggda API:et men det ger dig också många nya alternativ. Använd med försiktighet.