MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So geben Sie die Lesepräferenz in Mongo-Abfragen von Meteor an

Ich hoffe, das Folgende vermittelt ein besseres Verständnis der Beziehung zwischen Meteor und Mongo.

Meteor-Kollektionen für mehr Komfort

Meteor bietet Ihnen die volle Mongo-Funktionalität. Aus Gründen der Bequemlichkeit bietet es jedoch eine verpackte API einer Mongo-Kollektion, die sich am besten in die Meteor-Umgebung integriert. Wenn Sie also Mongo über

importieren
import { Mongo } from 'meteor/mongo' 

Sie importieren hauptsächlich die umschlossene Mongo-Sammlung, in der Operationen in einer Meteor-Faser ausgeführt werden. Die Cursor, die von Abfragen dieser verpackten Sammlungen zurückgegeben werden, sind auch nicht die "natürlichen" Cursor, sondern auch umbrochene Cursor Meteor-optimiert sein.

Wenn Sie versuchen, auf eine native Funktion auf diesen Instanzen zuzugreifen, die nicht implementiert ist, erhalten Sie eine Fehlermeldung. In Ihrem 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')
}); 

Führt zu

TypeError: docsCursor.readPref is not a function

Zugriff auf die Node-Mongo-Treibersammlungen

Die gute Nachricht ist, Sie können auf die Ebene darunter zugreifen über Collection.rawCollection() wo Sie vollen Zugriff auf den Mongo-Treiber des Knotens haben. Denn unter der Haube steckt Meteors Mongo.Collection und es ist Cursor verwenden letztendlich diesen nativen Treiber.

Jetzt finden Sie zwei weitere Probleme:

  1. readPref wird in einem Node-Mongo-Cursor cursor.setReadPreference benannt (3.1-API).

  2. Cursor.fetch existiert nicht, heißt aber cursor.toArray was (wie viele native Operationen) ein Promise zurückgibt

Um Ihre Frage endlich zu beantworten

Sie können Folgendes tun:

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

Zusammenfassung

  • Durch die Verwendung von collection.rawCollection() Sie haben Zugriff auf das gesamte Spektrum der Node-Mongo-Treiber-API

  • Die Integration der Operationen, Cursors und Ergebnisse (Promises) in Ihre Umgebung liegt in Ihrer Verantwortung. Gute Helfer sind Meteor.bindEnvironment und Meteor.wrapAsync

  • Achten Sie auf API-Änderungen des Node-Mongo-Treibers. Einerseits die vom Treiber unterstützte Mongo-Version, andererseits die von Meteor unterstützte Treiberversion.

  • Beachten Sie, dass es einfacher ist, Dinge mit der nativen API zu "vermasseln", aber es gibt Ihnen auch viele neue Optionen. Mit Vorsicht verwenden.