我需要从 Meteor 中的 mongodb 获取不同的值(基本上,实现 mongodb native distinct() 调用)。在客户端,Meteor 是否对集合有不同的查询?- 这就像一个魅力。但我不知道如何在服务器端获得类似的工作。感谢任何帮助。谢谢!
2 回答
好的,在对代码进行了一些挖掘并意识到 mongo lib 包含所有需要的方法的本机实现之后,我重用了来自https://github.com/meteor/meteor/pull/644的 aggregate() 解决方案
简单的更改和对 coffeescript 的翻译提供了以下代码片段以放入您的服务器端代码:
path = __meteor_bootstrap__.require("path")
MongoDB = __meteor_bootstrap__.require("mongodb")
Future = __meteor_bootstrap__.require(path.join("fibers", "future"))
myCollection = new Meteor.Collection "my_collection"
#hacky distinct() definition from https://github.com/meteor/meteor/pull/644
myCollection.distinct = (key)->
future = new Future
@find()._mongo.db.createCollection(@_name,(err,collection)=>
future.throw err if err
collection.distinct(key, (err,result)=>
future.throw(err) if err
future.ret([true,result])
)
)
result = future.wait()
throw result[1] if !result[0]
result[1]
缺点是您必须为每个新集合定义它,但这很容易通过 _.extend 或我猜的其他方法修复...
PS它现在也是一个智能包 -mrt add mongodb-aggregation
如果有人在 Meteor v1.0+ (1.0.2) 中尝试这个,这个代码对我有用,我把它放在服务器上。与提到调整的 J Ho 的答案基本相同 - Npm.require 以及 Future['return']。为那里的 Coffeescripters 清理了一点。
我正在考虑这个包,但已经有meteorhacks:aggregate
包(只有aggregate
功能),因此不想用另一个包覆盖它。distinct
所以,我只是在其他人的帮助下推出了自己的产品。
希望这对某人有帮助!最有可能的是,如果我继续在更多集合上使用 distinct,我会_.extend Meteor.Collection
在这里使用:https://github.com/zvictor/meteor-mongo-server/blob/master/server.coffee
path = Npm.require('path')
Future = Npm.require(path.join('fibers', 'future'))
myCollection = new Meteor.Collection "my_collection"
myCollection.distinct = (key, query) ->
future = new Future
@find()._mongo.db.createCollection @_name, (err,collection) =>
future.throw err if err
collection.distinct key, query, (err,result) =>
future.throw(err) if err
future['return']([true,result])
result = future.wait()
throw result[1] if !result[0]
result[1]