Saya harap berikut ini memberikan pemahaman yang lebih baik tentang hubungan antara Meteor dan Mongo.
Koleksi meteor untuk kenyamanan lebih
Meteor memberi Anda fungsionalitas mongo penuh. Namun untuk kenyamanan, ia menyediakan API yang dibungkus koleksi mongo yang paling terintegrasi dengan lingkungan Meteor. Jadi jika Anda mengimpor Mongo melalui
import { Mongo } from 'meteor/mongo'
Anda terutama mengimpor koleksi mongo yang dibungkus di mana operasi dijalankan dalam serat Meteor. Kursor yang dikembalikan oleh kueri dari koleksi yang dibungkus ini juga bukan kursor "alami" tetapi juga kursor terbungkus untuk dioptimalkan Meteor.
Jika Anda mencoba mengakses fitur asli pada instance ini yang tidak diterapkan, Anda akan menerima kesalahan. Dalam kasus Anda:
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')
});
Mengarah ke
TypeError: docsCursor.readPref is not a function
Mengakses koleksi driver node mongo
Kabar baiknya adalah, Anda dapat mengakses lapisan di bawahnya
melalui Collection.rawCollection()
di mana Anda memiliki akses penuh ke driver node Mongo. Ini karena di bawah kap Meteor Mongo.Collection
dan itu Cursor
menggunakan driver asli ini pada akhirnya.
Sekarang Anda akan menemukan dua masalah lain:
-
readPref
dinamai dalam kursor node-mongo cursor.setReadPreference (3.1 API). -
Cursor.fetch
tidak ada tetapi bernamacursor.toArray
yang (seperti yang dilakukan banyak operasi asli) mengembalikan Janji
Jadi akhirnya menjawab pertanyaan Anda
Anda dapat melakukan hal berikut:
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))
});
Ringkasan
-
Dengan menggunakan
collection.rawCollection()
Anda memiliki akses ke spektrum penuh API driver node mongo -
Anda sendirian untuk mengintegrasikan operasi, kursor, dan hasil (Janji) ke dalam lingkungan Anda. Pembantu yang baik adalah Meteor.bindEnvironment dan Meteor.wrapAsync
-
Waspadalah terhadap perubahan API dari driver node-mongo. Di satu sisi versi mongo yang didukung oleh driver, di sisi lain versi driver yang didukung oleh Meteor.
-
Perhatikan bahwa lebih mudah untuk "mengacaukan" hal-hal dengan API asli tetapi juga memberi Anda banyak opsi baru. Gunakan dengan hati-hati.