首页 > 解决方案 > Mongoose 聚合得到 2 个变量

问题描述

我无法使用聚合来获取 2 个变量。在我的集合中,我想通过 createdAt 过滤掉某些文档,并将每个匹配的文档推送到数组变量中。

之后,我还想要第二个变量,它显示匹配的文档数量。

我设法在他们自己的聚合中将它们分开,但不知何故我不能将它们组合在一起以在 1 个聚合中工作

对象数组的一个:

const data = await MyList.aggregate([
    {
        $match: {
            createdAt: { $lt: new Date(myDate) }
        }
    },
    { $limit: 10 },
    { $skip: 20 }
]);

计数的一个:

const data = await MyList.aggregate([
    {
        $match: {
            createdAt: { $lt: new Date(myDate) }
        }
    },
    {
        $group: {
            _id: null,
            count: { $sum: 1 }
        }
    },
    { $limit: 10 },
    { $skip: 20 }
]);

所以我想在 data 变量中是这样的:

{
    items: [ {...}, {...}, ...],
    count: 24
}

标签: node.jsmongooseaggregation-framework

解决方案


如果您的 mongodb 服务器版本等于或大于 3.4,则可以使用$facet聚合:

const data = await MyList.aggregate([
  {
    $match: {
      createdAt: { $lt: new Date(myDate) }
    }
  },
  {
    $facet: {
      items: [{ $skip: 0 }, { $limit: 10 }],
      count: [
        {
          $count: "count"
        }
      ]
    }
  }
]);

这将为您提供如下结果:(项目将有 10 个项目,但计数将是符合条件的文档总数)

[
  {
    "items": [
      {
        "_id": "5dd5182d45409447308379df",
        "createdAt": "2019-11-20T10:40:21.040Z",
        "name": "a1",
        "__v": 0
      },
      {
        "_id": "5dd5183345409447308379e0",
        "createdAt": "2019-11-20T10:40:21.040Z",
        "name": "a2",
        "__v": 0
      },
      ...
      ...
      {
        "_id": "5dd5185545409447308379e8",
        "createdAt": "2019-11-20T10:40:21.040Z",
        "name": "a10",
        "__v": 0
      }
    ],
    "count": [
      {
        "count": 21
      }
    ]
  }
]

您可以像这样重塑这些数据:

    let result = {
      items: [],
      count: 0
    };

    if (data && data[0] && data[0].items.length) {
      result = {
        items: data[0].items,
        count: data[0].count[0].count
      };
    }

结果会是这样:(更容易让客户解析)

{
  "items": [
    {
      "_id": "5dd5182d45409447308379df",
      "createdAt": "2019-11-20T10:40:21.040Z",
      "name": "a1",
      "__v": 0
    },
    {
      "_id": "5dd5183345409447308379e0",
      "createdAt": "2019-11-20T10:40:21.040Z",
      "name": "a2",
      "__v": 0
    },
    ...
    ...
    {
      "_id": "5dd5185545409447308379e8",
      "createdAt": "2019-11-20T10:40:21.040Z",
      "name": "a10",
      "__v": 0
    }
  ],
  "count": 21
}

如果没有文件匹配,结果将是:

{
    "items": [],
    "count": 0
}

推荐阅读