J'espère que ce qui suit permet de mieux comprendre la relation entre Meteor et Mongo.
Collections Meteor pour plus de confort
Meteor vous offre toutes les fonctionnalités de mongo. Cependant, pour plus de confort, il fournit une API encapsulée d'une collection mongo qui s'intègre le mieux à l'environnement Meteor. Donc, si vous importez Mongo via
import { Mongo } from 'meteor/mongo'
vous importez principalement la collection mongo enveloppée où les opérations sont exécutées dans une fibre Meteor. Les curseurs renvoyés par les requêtes de ces collections enveloppées ne sont pas non plus les curseurs "naturels" mais aussi curseurs enveloppés être optimisé pour Meteor.
Si vous essayez d'accéder à une fonctionnalité native sur ces instances qui n'est pas implémentée, vous recevrez une erreur. Dans votre cas :
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')
});
Mène à
TypeError: docsCursor.readPref is not a function
Accéder aux collections de pilotes node mongo
La bonne nouvelle est que vous pouvez accéder à la couche en dessous
via Collection.rawCollection()
où vous avez un accès complet au pilote de nœud Mongo. En effet, sous le capot, la Mongo.Collection
de Meteor et c'est Cursor
utilisent finalement ce pilote natif.
Vous allez maintenant découvrir deux autres problèmes :
-
readPref
est nommé dans un curseur node-mongo cursor.setReadPreference (API 3.1). -
Cursor.fetch
n'existe pas mais est nommécursor.toArray
qui (comme le font de nombreuses opérations natives) renvoie une promesse
Alors pour enfin répondre à votre question
vous pouvez faire ce qui suit :
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))
});
Résumé
-
En utilisant
collection.rawCollection()
vous avez accès au spectre complet de l'l'API du pilote Node Mongo -
Vous êtes autonome pour intégrer les opérations, les curseurs et les résultats (Promises) dans votre environnement. Les bons assistants sont Meteor.bindEnvironment et Meteor.wrapAsync
-
Méfiez-vous des changements d'API du pilote node-mongo. D'une part la version mongo prise en charge par le pilote, d'autre part la version du pilote prise en charge par Meteor.
-
Notez qu'il est plus facile de "gâcher" les choses avec l'API native, mais cela vous offre également de nombreuses nouvelles options. À utiliser avec précaution.