mongodb distinct()在服务器上的Meteor实现?

时间:2013-02-15 19:16:55

标签: mongodb meteor

我需要从Meteor中的mongodb中获取不同的值(基本上,实现mongodb native distinct()调用)。在客户端,Does Meteor have a distinct query for collections? - 这就像一个魅力。但我无法弄清楚如何在服务器端获得类似的功能。感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:3)

好的经过一些挖掘代码并实现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修改另一个hack是非常简单的,或者我猜...

PS它现在也是一个智能包 - mrt add mongodb-aggregation

答案 1 :(得分:2)

如果有人在Meteor v1.0 +(1.0.2)中尝试这个,这段代码对我有用,我把它放在服务器上。基本上和J Ho在回答提到的调整时一样--Npm.require,以及Future [' return']。为那里的Coffeescripters清理了一点。

我正在考虑这个软件包,但已经有meteorhacks:aggregate个软件包(只有aggregate函数),因此不想用另一个软件包覆盖它。所以,我只是在其他人的帮助下推出自己的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]