3

0.6 まで meteor に同梱されていた 'mini-mongo' には集約に関していくつかの制限があったことは理解していますが、0.6 のリリースで話が少し楽になることを願っています。

私が回避しようとしているのは、ミニモンゴの「集約」の欠如です。

このようなレコードを持つmongodbがあります

db.account_records.findOne()
{
    "type" : "initial_balance",
    "amt" : 10,
    "account_id" : "95CPB9Be8NX3TGSpi",
    "_id" : "L9D7Agt4gW2Ht4NTA"
}

そして、次のようなクエリに(クライアントで)サブスクライブしたい..

db.events.aggregate( [ { $group: {_id:"$account_id", balance: { $sum: "$amt"}}}]);

..これは(端末の「mongo meteor」スタイルから「実際の」mongodbを使用して実行した場合)..

{
    "result" : [
        {
            "_id" : "Dn5Eouw8K4RrP9SGw",
            "balance" : 169.99922000000308
        },
        {
            "_id" : "Bawopno2QGs8guMWy",
            "balance" : 1
        },
        {
            "_id" : "95CPB9Be8NX3TGSpi",
            "balance" : 5
        }
    ],
    "ok" : 1
}

クライアント側で複雑な集計句を実行することが可能になる (または望ましい) 可能性は低いと思われるので、ミニモンゴを使用している理由がわかります。しかし、標準の npm モジュールを新しいバージョンの meteor にインストールする機能があれば、「本物の」mongo から発行して mini-mongo で購読できるクエリを作成するのが少し簡単になるのではないかと期待していましたか?

--

PS私はすでにこれを見つけましたが、これらすべての二重アンダースコアは私を緊張させています複雑なことをしようとしています... https://github.com/meteor/meteor/pull/644

4

2 に答える 2

2

使用されているサーバーでその集約プッシュを使用できます。Meteor 0.6.0 'engine' バージョンの前は、npmモジュールの統合はまだ非常に非公式であったため、アンダースコアは最終的に公式に使用できるようになりました。コム/流星/流星/プル/644 )

サーバーサイドjs

var path = Npm.require('path');
var MongoDB = Npm.require('mongodb');
var Future = Npm.require('fibers/future');

var Animals = new Meteor.Collection("animals");

Meteor.startup(function () {
  Animals.aggregate = function(pipeline) {
    var self = this;

    var future = new Future;
    self.find()._mongo.db.createCollection(self._name, function (err, collection) {
      if (err) {
        future.throw(err);
        return;
      }
      collection.aggregate(pipeline, function(err, result) {
        if (err) {
          future.throw(err);
          return;
        }
        future.ret([true, result]);
      });
    });
    var result = future.wait();
    if (!result[0])
      throw result[1];

    return result[1];
  };

});

Meteor.methods({
  myAggregationMethod: function() {
    return Animals.aggregate([ {$project: {dog:1, age:1}}, {$sort:{age:1}} ]);
  }
});

クライアント jsで、集計を呼び出す場合:

    Meteor.call('myAggregationMethod', function(err,result) {
      if (!err) {
          console.log(result)          
      } else {
        console.log(err);
      }
    });

mongodb パッケージの追加

1)プロジェクトにpackagesというディレクトリを作成して、パッケージを保存し、その中にmongodb npmパッケージ用のmongodbという別のディレクトリを作成します

package.js2) containingというmongodbにファイルを追加します

Package.describe({
  summary: "Mongodb driver"
});

Npm.depends({'mongodb':"1.2.14"});

Package.on_use(function (api) {
  api.add_files('lib.js', 'server');
});

lib.js以下を含む という名前の同じmongodbディレクトリに別のファイルを追加します。

if(typeof(Npm) != "undefined") {
    MongoDB = Npm.require("mongodb");
}
else
{
    console.log("Please upgrade meteor to 0.6.0")
    MongoDB = __meteor_bootstrap__.require("mongodb");
}

最後に行を削除します

var MongoDB = Npm.require("mongodb")server.js私たちがグローバルにスコープしたあなたからlib.js

于 2013-04-06T06:18:49.503 に答える
1

Meteor 0.9.0 に対する Akshat の回答を修正するには、次を使用します。

self.find()._mongo._withDb(function(db) {
  return db.createCollection(self._name, function(err, collection) {
    if (err) {
      console.log(err);
      future.throw(err);
      return;
    }
    return collection.aggregate(pipeline, function(err, result) {
      if (err) {
        future.throw(err);
        return;
      }
      return future["return"]([true, result]);
    });
  });
});

また、MongoDB = Npm.require("mongodb")ヘッダーに含める必要はありません。

于 2014-09-03T21:20:50.967 に答える