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

Sådan angives læsepræference i Meteors mongo-forespørgsler

Jeg håber, at følgende giver en bedre forståelse af forholdet mellem Meteor og Mongo.

Meteorsamlinger for mere komfort

Meteor giver dig den fulde mongo-funktionalitet. Men for komfort giver den en indpakket API af en mongo-kollektion, der bedst integreres med Meteor-miljøet. Så hvis du importerer Mongo via

import { Mongo } from 'meteor/mongo' 

du importerer primært den indpakkede mongo-samling, hvor operationer udføres i en Meteor-fiber. Markøren, der returneres af forespørgsler fra disse indpakkede samlinger, er heller ikke de "naturlige" markører, men også omviklede markører at blive Meteor-optimeret.

Hvis du forsøger at få adgang til en indbygget funktion på disse forekomster, som ikke er implementeret, vil du modtage en fejl. I dit tilfælde:

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')
}); 

Fører til

TypeError: docsCursor.readPref is not a function

Adgang til node mongo-driversamlinger

Den gode nyhed er, du kan få adgang til laget nedenunder via Collection.rawCollection() hvor du har fuld adgang til node Mongo-driveren. Dette skyldes, at under motorhjelmen Meteors Mongo.Collection og det er Cursor gør brug af denne native driver i sidste ende.

Nu vil du finde to andre problemer:

  1. readPref er navngivet i en node-mongo-markør cursor.setReadPreference (3.1 API).

  2. Cursor.fetch eksisterer ikke, men hedder cursor.toArray som (som mange indfødte operationer gør) returnerer et løfte

Så for endelig at besvare dit spørgsmål

du kan gøre følgende:

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))
});

Oversigt

  • Ved at bruge collection.rawCollection() du har adgang til hele spektret af node mongo driver API

  • Du er på egen hånd til at integrere operationer, markører og resultater (løfter) i dit miljø. Gode ​​hjælpere er Meteor.bindEnvironment og Meteor.wrapAsync

  • Pas på API-ændringer af node-mongo-driveren. På den ene side mongoversionen, der understøttes af driveren, på den anden side driverversionen, der understøttes af Meteor.

  • Bemærk, at det er nemmere at "rode" ting med den native API, men det giver dig også en masse nye muligheder. Brug med omhu.




  1. Sådan installeres CouchDB på Debian 10

  2. Få flere nøgleværdier fra Redis

  3. Hvad sker der med Meteor og Fibres/bindEnvironment()?

  4. Meteor uden mongo