sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo especificar la preferencia de lectura en las consultas mongo de Meteor

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:

  1. readPref se nombra en un cursor de node-mongo (API 3.1).

  2. Cursor.fetch no existe pero se llama cursor.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