1

我需要从 Meteor 中的 mongodb 获取不同的值(基本上,实现 mongodb native distinct() 调用)。在客户端,Meteor 是否对集合有不同的查询?- 这就像一个魅力。但我不知道如何在服务器端获得类似的工作。感谢任何帮助。谢谢!

4

2 回答 2

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 或我猜的其他方法修复...

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

于 2013-02-18T12:10:40.363 回答
2

如果有人在 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]
于 2015-01-14T09:47:27.183 回答