希望下面的内容能让大家更好的理解Meteor和Mongo的关系。
Meteor系列更舒适
Meteor 为您提供完整的 mongo 功能。然而为了舒适,它提供了封装的API与 Meteor 环境集成得最好的 mongo 集合。所以如果你通过导入 Mongo
import { Mongo } from 'meteor/mongo'
您主要导入包装好的 mongo 集合,其中的操作在 Meteor Fiber 中执行。这些包装集合的查询返回的游标也不是“自然”游标,而是包裹游标进行 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')
});
Leads to
TypeError: docsCursor.readPref is not a function
访问节点 mongo 驱动程序集合
好消息是,您可以访问下面的图层 via Collection.rawCollection()
您可以在其中完全访问节点 Mongo 驱动程序。这是因为在 Meteor 的幕后Mongo.Collection
这是Cursor
最终使用这个本机驱动程序。
现在你会发现另外两个问题:
readPref
在 node-mongo 游标中命名光标.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))
});
Summary
通过使用collection.rawCollection()
您可以访问全方位的节点 mongodb 驱动 API
您需要自行将操作、光标和结果(Promises)集成到您的环境中。好帮手是流星绑定环境 and Meteor.wrapAsync
请注意 Node-mongo 驱动程序的 API 更改。一方面是驱动支持的mongo版本,另一方面是Meteor支持的驱动版本。
请注意,使用本机 API 更容易“搞乱”事情,但它也为您提供了很多新选项。小心使用。