MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment spécifier la préférence de lecture dans les requêtes mongo de Meteor

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 :

  1. readPref est nommé dans un curseur node-mongo cursor.setReadPreference (API 3.1).

  2. 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é