Mam nadzieję, że poniższe informacje pozwolą lepiej zrozumieć relacje między Meteorem a Mongo.
Kolekcje Meteor dla większego komfortu
Meteor zapewnia pełną funkcjonalność mongo. Jednak dla wygody zapewnia opakowany interfejs API kolekcji mongo, która najlepiej integruje się ze środowiskiem Meteor. Więc jeśli importujesz Mongo przez
import { Mongo } from 'meteor/mongo'
importujesz przede wszystkim owiniętą kolekcję mongo, w której operacje są wykonywane na włóknie Meteor. Kursor zwracany przez zapytania tych opakowanych kolekcji również nie są „naturalnymi” kursorami, ale także kursory zawinięte do optymalizacji Meteora.
Jeśli spróbujesz uzyskać dostęp do natywnej funkcji w tych instancjach, która nie jest zaimplementowana, pojawi się błąd. W Twoim przypadku:
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')
});
Prowadzi do
TypeError: docsCursor.readPref is not a function
Dostęp do kolekcji sterowników węzła mongo
Dobra wiadomość jest taka, że możesz uzyskać dostęp do warstwy pod spodem
przez Collection.rawCollection()
gdzie masz pełny dostęp do sterownika węzła Mongo. To dlatego, że pod maską Meteora Mongo.Collection
i to jest Cursor
w końcu korzystają z tego natywnego sterownika.
Teraz znajdziesz dwa inne problemy:
-
readPref
jest nazwany w kursorze node-mongo cursor.setReadPreference (3.1 API). -
Cursor.fetch
nie istnieje, ale ma nazwęcursor.toArray
która (podobnie jak wiele operacji natywnych) zwraca obietnicę
Więc, aby w końcu odpowiedzieć na twoje pytanie
możesz wykonać następujące czynności:
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))
});
Podsumowanie
-
Używając
collection.rawCollection()
masz dostęp do pełnego spektrum interfejsu API sterownika węzła mongo -
Jesteś sam, aby zintegrować operacje, kursory i wyniki (obietnice) ze swoim środowiskiem. Dobrzy pomocnicy to Meteor.bindEnvironment i Meteor.wrapAsync
-
Uważaj na zmiany API sterownika node-mongo. Z jednej strony wersja mongo obsługiwana przez sterownik, z drugiej wersja sterownika obsługiwana przez Meteor.
-
Zauważ, że łatwiej jest „zepsuć” rzeczy z natywnym API, ale daje to również wiele nowych opcji. Używaj ostrożnie.