5

私はローカルで作業しています - これはライブ Web サイトでは決して行われません。Mongo の文字列化された集計パイプラインを受け入れ、結果をブラウザーに返すノード/エクスプレス サーバーを構築しました。

app.get('/aggregate/:collection', function(req, res) {

    var queryObject = JSON.parse(req.param('q'));

    var recProvider = getProviderForTable(req.params.collection);
    recProvider.getCollection(function(err, collection) {

        collection.aggregate(queryObject, {}, function(err, data) {
            res.json(data);
        });
    });

});

これにより、データの視覚化を作成しているブラウザーで簡単なクエリを実行できるようになります。

$.get(LOCAL_SERVER + '/aggregate/my_records?q=' + JSON.stringify(pipeline));

Mongoose が持っているようなクエリ ビルダーを構築し始めようとしましたが、集計パイプライン配列を構築するだけでした。上記のように、ブラウザーで Mongoose のクエリ ビルダーを使用して配列を作成し、それを使用してデータの高速サーバーにアクセスできるかどうか疑問に思っています。

連鎖可能なオブジェクトを構築したいので、例えば...

pipeline()
    .where('value').gt(1000)
    .where('category').in([1, 2, 3])
    .sort('-date')
    .skip(100).limit(10);

...集計パイプラインを返します。

[
    {
        $match: {
            value: {
                $gt: 1000
            },
            category: {
                $in: [1, 2, 3]
            }
        }
    },
    {
        $sort: {
            date: -1
        }
    },
    {
        $skip: 100,
        $limit: 10
    }
]
4

1 に答える 1

1

source を見ると、関数を使用しているときはいつでもaggregate()、パイプラインが というプロパティに格納されているように見えます_pipeline

あなたの例を使用して、このような集約パイプラインを書くと...

var myAggregation = Model  // "Model" should actually be the name of your model
    .aggregate()
    .match({ value: { $gt: 1000 } })
    .match({ category: { $in: [1, 2, 3] } })
    .sort('-date')
    .skip(100)
    .limit(10);

するとmyAggregation._pipelineこんな感じに・・・

[ { '$match': { value: { $gt: 1000 } } },
  { '$match': { category: { $in: [1, 2, 3] } } },
  { '$sort': { date: -1 } },
  { '$skip': 100 },
  { '$limit': 10 } ]

ただし、集計パイプラインの代わりにマングースwhere()で実際に作成する関数を使用していることに気付きました。Queryを使用するように設定されている場合はwhere()、条件とオプションの設定が少し異なります。の代わりにmyAggregation._pipeline、 と に分割されmyAggregation._conditionsますmyAggregation.options。まったく同じように書かれているわけではありませんが、必要な形式に変換できる可能性があります。

于 2013-11-20T16:05:23.937 に答える