如何在流星的mongo查询中指定读取首选项

时间:2018-07-14 04:50:36

标签: mongodb meteor

在Meteor Mongo中,如何在Meteor Mongo查询中将readPref指定为primary | secondary。

1 个答案:

答案 0 :(得分:1)

我希望以下内容可以更好地理解流星与Mongo之间的关系。


流星收集带来更多舒适感

Meteor为您提供完整的mongo功能。然而,为了舒适起见,它提供了wrapped API的mongo集合,该集合与Meteor环境最佳集成。因此,如果您通过

导入Mongo
import { 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


访问节点mongo驱动程序集合

好消息是,you can access the layer underneath通过Collection.rawCollection(),您可以完全访问节点Mongo驱动程序。这是因为Meteor的Mongo.Collection及其Cursor最终都在使用此本机驱动程序。

现在您将发现另外两个问题:

  1. readPref在节点mongo游标cursor.setReadPreference(3.1 API)中命名。

  2. 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.bindEnvironmentMeteor.wrapAsync

  • 谨防node-mongo驱动程序的API更改。一方面,驱动程序支持的mongo版本,另一方面,流星支持的驱动程序版本。

  • 请注意,使用本机API更容易“弄乱”事情,但是它还为您提供了许多新选项。小心使用。