MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come specificare la preferenza di lettura nelle query mongo di Meteor

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:

  1. readPref è denominato in un cursore node-mongo cursor.setReadPreference (3.1 API).

  2. Cursor.fetch non esiste ma si chiama cursor.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.