mongoDB和sails聚合不适用于nodejs

时间:2018-03-25 02:00:25

标签: node.js mongodb sails.js sails-mongo

我正在使用mongodb和sails框架,Production.find({})正常工作 但是Production.aggregate([])返回错误

  

Production.aggregate()不是函数

module.exports = {

    list : function(req,res) {

        Production.aggregate([{
            $project: {
                data: { $substr: ["$pt",0,10] },
                prodTempo: { $substr: ["$sis",0,10]}
            }


        }])
        .exec(function(err,collection ){
            if(err){
                res.send(500,{error:"DataBase Error"});
            }

            res.view('list',{producao:collection});

        });

    }

};

3 个答案:

答案 0 :(得分:2)

对于聚合,您需要先调用native函数。然后它看起来像这样:

const aggregateArray = [
  {
    $project: {
      data: { $substr: ['$pt', 0, 10] },
      prodTempo: { $substr: ['$sis', 0, 10] }
    }
  }
];

Production.native(function(err, prodCollection) {
  if (err) {
    // handle error 1
  } else {
    prodCollection
      .aggregate(aggregateArray)
      .toArray((err, results) => {
        if (err) {
          // handle error 2
        }

        // Do something with your results
      });
  }
});

答案 1 :(得分:2)

从Sails v1.0开始,不建议使用.native()方法,而推荐使用getDatastore()。manager。

https://sailsjs.com/documentation/reference/waterline-orm/models/native

由于当前版本的sails-mongo(v1.0.1)中存在一个错误,该错误不支持新的必需游标方法,因此我实际上已切换为使用Mongo View来管理聚合查询。

下面的模式“应该”可以工作,但是由于未正确支持Aggregate()函数的toArray()而目前未返回任何结果。它返回一个不支持toArray()方法的AggregateCursor。

我打算做什么

const myView = sails.getDatastore()。manager.collection(“ view_name”);

myView.find({...match/filter criteria...}).toArray((err, results) => {
            if (err) {
              // handle error 2
            }

            // Do something with your results
          });

我将整个聚合查询放入Mongo DB视图,并添加了其他列以根据需要支持过滤/匹配功能。我没有放入Mongo中的“ match”的唯一部分是我在上面的find()方法中使用的动态字段。这就是您需要其他字段的原因,因为find()仅查询查询中可用的列,而不查询基础模型

应该做什么

因此汇总模式现在如下:

const aggregateArray = [
  {
    $project: {
      data: { $substr: ['$pt', 0, 10] },
      prodTempo: { $substr: ['$sis', 0, 10] }
    }
  }
];

sails.getDatastore('name of datastore').manager.collection('collection name')
      .aggregate(aggregateArray)
      .toArray((err, results) => {
        if (err) {
          // handle error 2
        }

        // Do something with your results
      });

答案 2 :(得分:0)

const regexForFileName = '.*' + fileName + '.*';
var db = model.getDatastore().manager;
var rawMongoCollection = db.collection(model.tableName);
rawMongoCollection.aggregate(
    [
        {
            $project : {
                "_id" : 0,
                "fileId" : 1,
                "fileName" : 1,
                "fileSize" : 1,
                "createdTime" : 1
            }
        },
        { 
            $match : {
                "fileName" : { 
                    $regex: regexForFileName,
                    $options: 'i'
                }
            }
        },
        {
            $sort: {
                "createdTime" : -1
            }
        },
        {
            $skip: pageNumber * numberOfResultsPerPage
        },
        {
            $limit: numberOfResultsPerPage
        }
    ]
).toArray((err, results) => {
    if (err) {
        console.log(err);
    }
    console.log("results: " + JSON.stringify(results));
});