MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como especificar a preferência de leitura nas consultas mongo do Meteor


Espero que o seguinte forneça uma melhor compreensão da relação entre o Meteor e o Mongo.

Coleções de meteoros para maior conforto


O Meteor fornece a funcionalidade completa do mongo. No entanto, para maior conforto, ele fornece uma API encapsulada de uma coleção de mongo que se integra melhor com o ambiente Meteor. Então, se você importar o Mongo via
import { Mongo } from 'meteor/mongo' 

você importa principalmente a coleção mongo encapsulada onde as operações são executadas em uma fibra Meteor. O cursor retornado por consultas dessas coleções agrupadas também não são os cursores "naturais", mas também cursores encapsulados para ser otimizado para Meteor.

Se você tentar acessar um recurso nativo nessas instâncias que não foi implementado, receberá um erro. No seu 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')
}); 

Leva a
TypeError: docsCursor.readPref is not a function


Acessando as coleções de drivers do node mongo


A boa notícia é que você pode acessar a camada abaixo via Collection.rawCollection() onde você tem acesso total ao driver do nó Mongo. Isso ocorre porque sob o capô o Mongo.Collection do Meteor e é Cursor estão fazendo uso deste driver nativo no final.

Agora você encontrará dois outros problemas:

  1. readPref é nomeado em um cursor node-mongo cursor.setReadPreference (3.1 API).

  2. Cursor.fetch não existe, mas é nomeado cursor.toArray que (como muitas operações nativas fazem) retorna um Promise


Então, para finalmente responder sua pergunta


você pode fazer o seguinte:
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))
});


Resumo


  • Usando collection.rawCollection() você tem acesso a todo o espectro da API do driver do mongo do nó

  • Você está sozinho para integrar as operações, cursores e resultados (Promises) em seu ambiente. Bons ajudantes são Meteor.bindEnvironment e Meteor.wrapAsync

  • Cuidado com as alterações de API do driver node-mongo. Por um lado, a versão do mongo que é suportada pelo driver, por outro lado a versão do driver que é suportada pelo Meteor.

  • Observe que é mais fácil "estragar" as coisas com a API nativa, mas também oferece muitas novas opções. Use com cuidado.