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
importierenimport { 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:
-
readPref
wird in einem Node-Mongo-Cursor cursor.setReadPreference benannt (3.1-API). -
Cursor.fetch
existiert nicht, heißt abercursor.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.