sql >> Databáze >  >> NoSQL >> MongoDB

Jak zadat preferenci čtení v dotazech Meteor mongo

Doufám, že následující poskytne lepší pochopení vztahu mezi Meteorem a Mongo.

Meteorické kolekce pro větší pohodlí

Meteor vám poskytuje všechny funkce mongo. Pro pohodlí však poskytuje zabalené API z kolekce mongo, která se nejlépe integruje s prostředím Meteor. Pokud tedy importujete Mongo přes

import { Mongo } from 'meteor/mongo' 

primárně importujete zabalenou kolekci mongo, kde se operace provádějí ve vláknu Meteor. Kurzor vrácený dotazy těchto zabalených kolekcí také nejsou „přirozené“ kurzory, ale také zabalené kurzory být optimalizován pro meteorologii.

Pokud se v těchto instancích pokusíte o přístup k nativní funkci, která není implementována, zobrazí se chyba. Ve vašem případě:

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

Vede k

TypeError: docsCursor.readPref is not a function

Přístup ke sbírkám ovladačů node mongo

Dobrou zprávou je, že můžete přistupovat k vrstvě pod ní přes Collection.rawCollection() kde máte plný přístup k ovladači uzlu Mongo. Je to proto, že pod kapotou Meteor je Mongo.Collection a je to Cursor nakonec využívají tento nativní ovladač.

Nyní najdete dva další problémy:

  1. readPref je pojmenován v node-mongo kurzoru cursor.setReadPreference (3.1 API).

  2. Cursor.fetch neexistuje, ale má název cursor.toArray který (jako mnoho nativních operací) vrací Promise

Tak abych konečně odpověděl na vaši otázku

můžete provést následující:

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

Shrnutí

  • Pomocí collection.rawCollection() máte přístup k celému spektru rozhraní node mongo driver API

  • Operace, kurzory a výsledky (Promises) integrujete do svého prostředí sami. Dobrými pomocníky jsou Meteor.bindEnvironment a Meteor.wrapAsync

  • Dejte si pozor na změny API ovladače node-mongo. Na jedné straně mongo verze, kterou ovladač podporuje, na druhé straně verze ovladače, kterou podporuje Meteor.

  • Všimněte si, že s nativním API je snazší věci „pokazit“, ale také vám dává spoustu nových možností. Používejte opatrně.




  1. Facet + Aggregate Query pomocí problému ObjectId s Spring Data Mongo

  2. Jak vytvořit a používat Enum v Mongoose

  3. Instalace herního rámce mongodb morphia modulu

  4. Databáze grafů vs. databáze dokumentů vs. Triplestores