以下がMeteorとMongoの関係をよりよく理解するのに役立つことを願っています。
より快適なMeteorコレクション
Meteorは、完全なmongo機能を提供します。ただし、快適さのために、ラップされたAPI を提供します Meteor環境と最もよく統合するmongoコレクションのしたがって、Mongoを経由してインポートする場合
import { Mongo } from 'meteor/mongo'
主に、操作がMeteorファイバーで実行されるラップされたmongoコレクションをインポートします。これらのラップされたコレクションのクエリによって返されるカーソルも、「自然な」カーソルではなく、ラップされたカーソル Meteorに最適化されます。
実装されていないこれらのインスタンスでネイティブ機能にアクセスしようとすると、エラーが発生します。あなたの場合:
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')
});
につながる
TypeError: docsCursor.readPref is not a function
ノードmongoドライバーコレクションへのアクセス
幸いなことに、下のレイヤーにアクセスできます
Collection.rawCollection()
経由 ここで、ノードMongoドライバーに完全にアクセスできます。これは、MeteorのMongo.Collection
の内部にあるためです。 Cursor
です 最終的にこのネイティブドライバーを利用しています。
ここで、他に2つの問題があります。
-
readPref
ノードで名前が付けられます-mongoカーソルcursor.setReadPreference (3.1 API)。 -
Cursor.fetch
存在しませんが、cursor.toArray
という名前です これは(多くのネイティブオペレーションが行うように)Promiseを返します
最後にあなたの質問に答えるために
次のことができます:
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))
});
概要
-
collection.rawCollection()
を使用する nodemongoドライバーAPIの全範囲にアクセスできます。 a> -
操作、カーソル、および結果(Promise)を環境に統合するのはあなた自身です。優れたヘルパーは、Meteor.bindEnvironment です。 および
Meteor.wrapAsync -
node-mongoドライバーのAPIの変更に注意してください。一方では、ドライバーによってサポートされているmongoバージョンであり、他方では、Meteorによってサポートされているドライバーバージョンです。
-
ネイティブAPIを使用すると、物事を「混乱」させる方が簡単ですが、多くの新しいオプションも提供されることに注意してください。注意して使用してください。