Mongoose错误:参数必须是聚合管道运算符

时间:2016-05-20 07:32:52

标签: node.js mongodb mongoose mongodb-query aggregation-framework

我无法使用聚合选项参数获得结果。这是我的汇总: -

var emails = getAllEmails();
var listMatchColl = 'list_matches_' + insertedId;
SurveyDL.aggregate([
     { $match: { email: { $in: emails } } },
     { $out: listMatchColl }
 ], {
   allowDiskUse: true
 }).exec(function(err, data) {
  if (err) return console.log('err', err);
    console.log('data',data);
 });
}

当我执行上面的代码时,它抛出并出现错误,

  

错误:参数必须是聚合管道运算符       在Aggregate.append(/home/vivek/nrich/node_modules/mongoose/lib/aggregate.js:89:11)       at new Aggregate(/home/vivek/nrich/node_modules/mongoose/lib/aggregate.js:48:17)

我也使用替代方法,但它仍然会抛出相同的错误。替代方式: -

var emails = getAllEmails();
var listMatchColl = 'list_matches_' + insertedId;
SurveyDL.aggregate([
     { $match: { email: { $in: emails } } },
     { $out: listMatchColl }
 ], {
   allowDiskUse: true
 },function(err, data) {
  if (err) return console.log('err', err);
    console.log('data',data);
 });

2 个答案:

答案 0 :(得分:9)

尝试为聚合查询设置 allowDiskUse() 选项:

var emails = getAllEmails();
var listMatchColl = 'list_matches_' + insertedId;
SurveyDL.aggregate([
    { '$match': { 'email': { '$in': emails } } },
    { '$out': listMatchColl }
 ]).allowDiskUse(true)
   .exec(function(err, data) {
        if (err) return console.log('err', err);
        console.log('data',data);
    }); 

或使用流畅的API:

SurveyDL.aggregate()
        .match({ 'email': { '$in': emails } })
        .append({ '$out': listMatchColl })
        .allowDiskUse(true)
        .exec(function(err, data) {
            if (err) return console.log('err', err);
            console.log('data',data);
        });

如果您的数据是>,您可能会在16MB聚合大小limit上运行, allowDiskUse() 选项是不够的16MB,因为它只允许您在数据较大时使用排序。请考虑使用汇总 cursor 表单来访问您的汇总文档:

var cursor = SurveyDL.aggregate([
    { $match: { email: { $in: emails } } }    
 ]).cursor({ batchSize: 1000 }).exec();

cursor.each(function(error, doc) {
  // use doc
}); 

答案 1 :(得分:0)

var 电子邮件必须为数组

listMatchColl必须是字符串

{ $out: 'listMatchColl' }

如果您使用 $ out ,则无法看到您的聚合结果。 您在新集合中的结果' listMatchColl'。