在Meteor Mongo中,如何在Meteor Mongo查询中将readPref指定为primary | secondary。
答案 0 :(得分:1)
我希望以下内容可以更好地理解流星与Mongo之间的关系。
Meteor为您提供完整的mongo功能。然而,为了舒适起见,它提供了wrapped API的mongo集合,该集合与Meteor环境最佳集成。因此,如果您通过
导入Mongoimport { Mongo } from 'meteor/mongo'
主要是导入包装的mongo集合,在其中用流星纤维执行操作。这些打包的集合的查询返回的游标也不是“自然”游标,而是wrapped cursors要进行流星优化。
如果您尝试在未实现的这些实例上访问本机功能,则会收到错误消息。就您而言:
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
好消息是,you can access the layer underneath通过Collection.rawCollection()
,您可以完全访问节点Mongo驱动程序。这是因为Meteor的Mongo.Collection
及其Cursor
最终都在使用此本机驱动程序。
现在您将发现另外两个问题:
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()
,您可以访问node mongo driver API的整个频谱
您可以独自将操作,游标和结果(承诺)集成到您的环境中。好帮手是Meteor.bindEnvironment和Meteor.wrapAsync
谨防node-mongo驱动程序的API更改。一方面,驱动程序支持的mongo版本,另一方面,流星支持的驱动程序版本。
请注意,使用本机API更容易“弄乱”事情,但是它还为您提供了许多新选项。小心使用。