获取分页Mongo聚合查询中匹配项的总数

时间:2016-06-17 21:10:55

标签: javascript mongodb

我已经看过关于SO的基本问题,但却无法使其在我的案例中发挥作用。这是我的疑问:

return Order.aggregateAsync([{
     $match: { status: { $ne: 'incomplete' } }
   }, {
     $unwind: '$items'
   }, {
     $match: {... }
   },

   {
     $limit: limit
   }, {
     $skip: skip
   }, {
     $group: {
       _id: '$items._id',
       product: {
         $first: '$items.product'
       },
       qty: {
         $first: '$items.qty'
       },
       ordered: {
         $first: '$ordered'
       }

     }
   }, {
     $sort: { 'ordered': -1 }
   },
 ])...

如何从以下内容返回:

{ 
  items: [array of items by page/limit],
  total: total items in db that match $match
}

我尝试在$ match之后添加此内容:

 {
   $group: {
     _id: null,
     items: { $push: '$items' },
     count: { $sum: 1 }
   }
 }, 

但似乎没有使用限制。

示例数据:

[{
    _id:ObjectID
    status: 'incomplete'
    ordered: Date,
    items: [{
      _id: ObjectID
      qty: 100,
      product: ObjectID
    }, {
      _id: ObjectID
      qty: 10,
      product: ObjectID
    }]
}, {
    _id:ObjectID
    status: 'incomplete'
    ordered: Date,
    items: [{
      _id: ObjectID
      qty: 200,
      product: ObjectID
    }]
}]

我想返回所有项目,按项目分组作为分页查询(限制,跳过):

 [{
  _id: ObjectID
  qty: 100,
  product: ObjectID
}, {
  _id: ObjectID
  qty: 10,
  product: ObjectID
}, {
  _id: ObjectID
  qty: 200,
  product: ObjectID
}]

以及匹配的所有项目的总数(3)。

所以:

result = {
  docs: items array above,
  total: 3

1 个答案:

答案 0 :(得分:0)

你试试这个查询,它对你有用,它会给你想要的结果

db.getCollection('collectionName').aggregate([

   { $unwind: '$items'},
   {
       $group:
         {
           _id: "",
            "doc": { $push: "$items" },
            "total":{ $sum: 1}

         }
     },
    { $project : { doc : 1 , total : 1,_id:0 } } 
])

输出

{
            "doc" : [ 
                {
                    "_id" : 11,
                    "qty" : 100,
                    "product" : 12
                }, 
                {
                    "_id" : 111,
                    "qty" : 10,
                    "product" : 112
                }, 
                {
                    "_id" : 21,
                    "qty" : 100,
                    "product" : 22
                }, 
                {
                    "_id" : 211,
                    "qty" : 10,
                    "product" : 212
                }
            ],
            "total" : 4.0000000000000000
        }