【问题标题】:mongoDB and sails aggregate dont work with nodejsmongoDB 和sails 聚合不适用于nodejs
【发布时间】:2018-03-25 02:00:24
【问题描述】:

我正在使用 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});

        });

    }

};

【问题讨论】:

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


    【解决方案1】:

    从 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 的“匹配”的唯一部分是我在上面的 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
          });
    

    【讨论】:

    • 我收到此错误:ReferenceError:sails is not defined
    • @SagarVirpara 确保在您的 config/globals.js 中有“sails:true”,否则sails 对象不会自动连接为全局对象。
    【解决方案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
          });
      }
    });
    

    【讨论】:

    • 这不适用于 v1,因为 .native() 已弃用。
    【解决方案3】:
    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));
    });
    

    【讨论】:

      猜你喜欢
      • 2017-08-03
      • 2021-04-20
      • 2013-06-24
      • 2020-12-30
      • 2020-12-22
      • 2018-08-17
      • 1970-01-01
      • 2013-04-05
      • 2021-04-25
      相关资源
      最近更新 更多