首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猫鼬聚合得到2个变量

猫鼬聚合得到2个变量
EN

Stack Overflow用户
提问于 2019-11-20 09:39:42
回答 1查看 324关注 0票数 0

我很难使用聚合来获得两个变量。在我的集合中,我希望通过createdAt过滤出某些文档,并将每个匹配的文档推入一个数组变量中。

在此之后,我还希望有第二个变量,它显示匹配的文档数量的计数。

我设法在它们自己的聚合中将它们分开,但不知怎么我不能将它们组合在一起,在一个聚合中工作。

对象数组的一个:

代码语言:javascript
复制
const data = await MyList.aggregate([
    {
        $match: {
            createdAt: { $lt: new Date(myDate) }
        }
    },
    { $limit: 10 },
    { $skip: 20 }
]);

供计数的:

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

因此,我想在数据变量中得到这样的内容:

代码语言:javascript
复制
{
    items: [ {...}, {...}, ...],
    count: 24
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-20 12:33:58

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

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

这将给出如下结果:(项目将有10项,但计数将是符合标准的文档总数)

代码语言:javascript
复制
[
  {
    "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
      }
    ]
  }
]

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

代码语言:javascript
复制
    let result = {
      items: [],
      count: 0
    };

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

结果如下:(客户端更容易解析)

代码语言:javascript
复制
{
  "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
}

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

代码语言:javascript
复制
{
    "items": [],
    "count": 0
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58951098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档