mongoDB 和 sails aggregate 不与 nodejs 一起工作

mongoDB and sails aggregate dont work with nodejs

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

Production.aggregate() is not a function

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});

        });

    }

};

对于聚合,您需要先调用 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
      });
  }
});

从 Sails v1.0 开始,.native() 方法已弃用,取而代之的是 getDatastore().manager。

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

由于当前版本的 sails-mongo (v1.0.1) 不支持新的必需游标方法的错误,我实际上已经切换到使用 Mongo 查看管理聚合查询。

下面的模式 "supposed" 可以工作,但目前 returns 没有结果,因为目前没有正确支持 aggregate() 函数的 toArray() 。它 returns 一个不支持 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 数据库视图中,并根据需要添加了额外的列以支持 filter/match 功能。我没有放入 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
      });
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));
});