【问题标题】:Using MongoDB $out aggregation operator in node.js在 node.js 中使用 MongoDB $out 聚合运算符
【发布时间】:2015-05-14 23:54:41
【问题描述】:

有人知道如何使用 $out 运算符将 MongoDB 聚合函数的结果推送到 node.js 中的新集合中吗?

这就是我所拥有的:

var fs = require('fs');
var assert = require('assert');
var ObjectId = require('mongodb').ObjectID;
var MongoClient = require('mongodb').MongoClient
    , format = require('util').format;

var createGroups = function(db, callback) {
   db.collection('people').aggregate(
     [
       { $group: { "_id": "$code", "sendees" : {$push : "$email"}, "count": { $sum: 1 } } }

     ]
   ).toArray(function(err, result) {
     assert.equal(err, null);
     console.log(result);
     callback(result);

   });
};

MongoClient.connect('mongodb://localhost:12121/systest', function(err, db) {
  assert.equal(null, err);
  createGroups(db, function() {
      db.close();
  });
});

哪个输出到控制台很好,正如我所期望的那样 - 但我在尝试将它导出到新集合时运气不佳。

谢谢!

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    您只需要在聚合中提供$out。请参阅docs

    所以你的代码应该是这样的:

    db.collection('人').aggregate( [ { $组:{ "_id": "$code", “sendees”:{$push:“$email”}, “计数”:{ $sum:1 } } }, { $out: "集合名称" } ] )

    【讨论】:

    • 我发现虽然$out 似乎确实有效,但您还可以将out 参数提供给Node.js 驱动程序的aggregate() 函数,请参阅mongodb.github.io/node-mongodb-native/api-generated/… .. 所以, db.collection(name).aggregate([ ..pipeline.. ], { out: 'collection name' }), seems to work for me, though I did find with both approaches the aggregate would seem to lock up if I didn't provide a callback function in the third argument, or handle on('data', ..')` 和 on('end', ..) 在从 aggregate() 返回的 AggregationCursor 上。
    • 请注意 $out 直到请求光标上的某种 I/O(例如 toArray)才会生效,请参阅 stackoverflow.com/q/49835278/3746543 这不是问题案例,但也许这个注释可以让其他人不去想为什么它对他们不起作用......
    【解决方案2】:

    您可以尝试使用 mongo-aggregate-out 包,它将聚合结果保存到 Mongo 版本

    var aggregateOut = require('mongo-aggregate-out'),
        pipelineArray = [
           { 
               $group: { 
                   "_id": "$code", 
                   "sendees" : {$push : "$email"}, 
                   "count": { $sum: 1 } 
               } 
           }
        ];
    
    var createGroups = function(db, callback) {
        aggregateOut(db.collection('people'), pipelineArray, { out: "newCollection"}, 
            function (err) {
                assert.equal(err, null);
                var cur = db.collection('newCollection').find();
                callback(cur);
        });
    };
    

    【讨论】:

      【解决方案3】:

      感谢您的回答 - 都非常有帮助。碰巧我在 $out 出现之前使用了一个过时的 mongo 版本 - 但是一旦我把它整理出来并按照你上面的建议做了,它就完美地工作了。

      【讨论】:

        猜你喜欢
        • 2018-10-03
        • 2018-09-24
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 2016-09-11
        • 2017-05-21
        • 2019-11-23
        相关资源
        最近更新 更多