sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man anger läspreferens i Meteors mongo-frågor

Jag hoppas att följande ger en bättre förståelse av förhållandet mellan Meteor och Mongo.

Meteorsamlingar för mer komfort

Meteor ger dig full mongo-funktionalitet. Men för komfort ger den ett omslutet API av en mongokollektion som bäst integrerar med Meteormiljön. Så om du importerar Mongo via

import { Mongo } from 'meteor/mongo' 

du importerar i första hand den inslagna mongosamlingen där operationer utförs i en Meteor-fiber. Markören som returneras av frågor från dessa inslagna samlingar är inte heller de "naturliga" markörerna utan också lindade markörer att bli Meteor-optimerad.

Om du försöker få åtkomst till en inbyggd funktion på dessa instanser som inte är implementerad kommer du att få ett felmeddelande. I ditt fall:

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

Leder till

TypeError: docsCursor.readPref is not a function

Åtkomst till samlingarna för nodmongodrivrutiner

Den goda nyheten är att du kan komma åt lagret under via Collection.rawCollection() där du har full tillgång till noden Mongo-drivrutinen. Detta beror på att under huven Meteors Mongo.Collection och det är Cursor använder den här inbyggda drivrutinen till slut.

Nu kommer du att hitta två andra problem:

  1. readPref namnges i en nod-mongo-markör cursor.setReadPreference (3.1 API).

  2. Cursor.fetch existerar inte men heter cursor.toArray som (som många inhemska operationer gör) returnerar ett löfte

Så för att äntligen svara på din fråga

du kan göra följande:

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

Sammanfattning

  • Genom att använda collection.rawCollection() du har tillgång till hela spektrumet av node mongo driver API a>

  • Du är på egen hand att integrera verksamheten, markörerna och resultaten (löften) i din miljö. Bra hjälpare är Meteor.bindEnvironment och Meteor.wrapAsync

  • Akta dig för API-ändringar av node-mongo-drivrutinen. Å ena sidan mongoversionen som stöds av föraren, å andra sidan drivrutinsversionen som stöds av Meteor.

  • Observera att det är lättare att "röra till" saker med det inbyggda API:et men det ger dig också många nya alternativ. Använd med försiktighet.




  1. MongoDB listar databaser med givet prefix i Go

  2. MongoDB Upsert förklaras

  3. Hur man skapar MongoDB MultiKey-index på attribut för objekt i en array .NET-drivrutin

  4. MongoDB $dateFromParts