Espero que lo siguiente proporcione una mejor comprensión de la relación entre Meteor y Mongo.
Colecciones Meteor para mayor comodidad
Meteor le proporciona la funcionalidad completa de mongo. Sin embargo, para mayor comodidad, proporciona una API empaquetada de una colección mongo que se integra mejor con el entorno Meteor. Entonces, si importas Mongo a través de
import { Mongo } from 'meteor/mongo'
principalmente importa la colección mongo envuelta donde las operaciones se ejecutan en una fibra Meteor. El cursor que devuelven las consultas de estas colecciones envueltas tampoco son los cursores "naturales", sino también cursores envueltos para ser Meteor optimizado.
Si intenta acceder a una función nativa en estas instancias que no está implementada, recibirá un error. En su 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')
});
Conduce a
TypeError: docsCursor.readPref is not a function
Acceso a las colecciones de controladores mongo del nodo
La buena noticia es que puedes acceder a la capa inferior
a través de Collection.rawCollection()
donde tiene acceso completo al controlador del nodo Mongo. Esto se debe a que, bajo el capó, la Mongo.Collection
de Meteor y es Cursor
están haciendo uso de este controlador nativo al final.
Ahora encontrará otros dos problemas:
-
readPref
se nombra en un cursor de node-mongo (API 3.1). -
Cursor.fetch
no existe pero se llamacursor.toArray
que (como lo hacen muchas operaciones nativas) devuelve una Promesa
Para finalmente responder a tu pregunta
puedes hacer lo siguiente:
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))
});
Resumen
-
Usando
collection.rawCollection()
usted puede tener acceso al espectro completo de la node mongo driver API -
Está solo para integrar las operaciones, los cursores y los resultados (Promesas) en su entorno. Buenos ayudantes son Meteor.bindEnvironment y Meteor.wrapAsync
-
Tenga cuidado con los cambios de API del controlador node-mongo. Por un lado, la versión de mongo que es compatible con el controlador, por otro lado, la versión del controlador que es compatible con Meteor.
-
Tenga en cuenta que es más fácil "arruinar" las cosas con la API nativa, pero también le brinda muchas opciones nuevas. Usar con cuidado.