如何在服务器端nodejs函数中使用mongoDB聚合?

时间:2017-01-27 06:42:43

标签: node.js mongodb mongoose

我是nodejs的新用户,我正试图在mongoDB的集合中获取所有重复的文档,因为我在mongo shell中尝试了以下查询

 db.collection.aggregate([
    {
      $group: {
        _id: {
          ProductName: "$ProductName"
        },
        uniqueIds: {
          $addToSet: "$_id"
        },
        count: {
          $sum: 1
        }
      }
    },
    {
      $match: {
        count: {
          $gte: 2
        }
      }
    },
    {
      $sort: {
        count: -1
      }
    }
])

在mongo shell结果中:

    {
            "_id" : {
                    "ProductName" : "Sony Mobile"
            },
            "uniqueIds" : [
                    ObjectId("5728ce42a069270e00e59910"),
                    ObjectId("5728cde6a069270e00e5990e")
            ],
            "count" : 2
    },

   {
            "_id" : {
                    "ProductName" : "Nokia Mobile"
            },
            "uniqueIds" : [
                    ObjectId("5728ce42a069270e00e59920"),
                    ObjectId("5728cde6a069270e00e5990f")
            ],
            "count" : 2
    }

在mongo shell中,它正确地提供了我想要的结果,但我在nodejs服务器端函数中尝试了相同的查询,如下所示

  Company.aggregate([
    {
      $group: {
        _id: {
          Proname: "$Proname"
        },
        uniqueIds: {
          $addToSet: "$_id"
        },
        count: {
          $sum: 1
        }
      }
    },
    {
      $match: {
        count: {
          $gte: 2
        }
      }
    },
    {
      $sort: {
        count: -1
      }
    }
]).then(function (dupProds) {
    console.log("ALL DUPLICATE PRDCTS : " + JSON.stringify(dupProds));
  })
};

它向我显示了一个错误Compnay.aggregate(...)。然后它不是一个函数,我尝试了不同的方式但没有用,现在怎样才能得到与我在mongoshell中得到的结果相同的结果。

2 个答案:

答案 0 :(得分:1)

使用error代替result mongoose 回调功能参数Company.aggregate([ { $group: { _id: { Proname: "$Proname" }, uniqueIds: { $addToSet: "$_id" }, count: { $sum: 1 } } }, { $match: { count: { $gte: 2 } } }, { $sort: { count: -1 } } ]).exec(function (err,dupProds) { if(err) { // return err; } console.log("ALL DUPLICATE PRDCTS : ", dupProds); // return dupProds }) }; 然后then。< / p>

then

实际上aggregate([{..}]).exec().then(function(result){..})致力于承诺,因此如果您想使用aggregate([{..}]).exec(),则需要承诺。所以可以像

一样使用

{{1}}

其中{{1}}返回承诺

答案 1 :(得分:1)

您需要在exec之前致电then

  Company.aggregate(params).exec().then(function (dupProds) {
    console.log("ALL DUPLICATE PRDCTS : " + JSON.stringify(dupProds));
  })
};

[http://mongoosejs.com/docs/api.html#aggregate_Aggregate-exec]