Spero che quanto segue fornisca una migliore comprensione della relazione tra Meteor e Mongo.
Collezioni Meteor per un maggiore comfort
Meteor ti offre la funzionalità completa di mongo. Tuttavia, per comodità, fornisce un'API avvolta di una collezione mongo che si integra al meglio con l'ambiente Meteor. Quindi, se importi Mongo tramite
import { Mongo } from 'meteor/mongo'
importi principalmente la raccolta mongo avvolta in cui le operazioni vengono eseguite in una fibra Meteor. Anche il cursore restituito dalle query di queste raccolte avvolte non sono i cursori "naturali", ma anche cursori avvolti essere ottimizzato per Meteor.
Se provi ad accedere a una funzionalità nativa su queste istanze che non è implementata, riceverai un errore. Nel tuo caso:
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')
});
Porta a
TypeError: docsCursor.readPref is not a function
Accesso alle raccolte di driver mongo del nodo
La buona notizia è che puoi accedere al livello sottostante
tramite Collection.rawCollection()
dove hai pieno accesso al driver del nodo Mongo. Questo perché sotto il cofano c'è Mongo.Collection
di Meteor ed è Cursor
stanno facendo uso di questo driver nativo alla fine.
Ora troverai altri due problemi:
-
readPref
è denominato in un cursore node-mongo cursor.setReadPreference (3.1 API). -
Cursor.fetch
non esiste ma si chiamacursor.toArray
che (come fanno molte operazioni native) restituisce una Promessa
Quindi per rispondere finalmente alla tua domanda
puoi fare quanto segue:
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))
});
Riepilogo
-
Usando
collection.rawCollection()
hai accesso all'intero spettro dell'API del driver node mongo -
Sei da solo per integrare le operazioni, i cursori e i risultati (Promesse) nel tuo ambiente. Buoni aiutanti sono Meteor.bindEnvironment e Meteor.wrapAsync
-
Fai attenzione alle modifiche alle API del driver node-mongo. Da un lato la versione mongo supportata dal driver, dall'altro la versione driver supportata da Meteor.
-
Nota che è più facile "incasinare" le cose con l'API nativa, ma ti offre anche molte nuove opzioni. Usare con cura.