MongoDB聚合: Group all records into a single result

标签 mongodb database

在 mongodb 聚合调用中,如何使用 $group 运算符将管道中的所有文档分组为单个结果?

假设我有一个如下所示的记录集合:

{
    user_id: 234,
    signup_date: 2013-06-27
}

我想使用聚合函数在数据库中查询在给定日期范围内注册的用户列表,并将其作为列表返回。我想要一个看起来像这样的结果:

{
    users: [234, 235, 236]
}

我的查询如下所示:

db.users.aggregate([

    { $match: {
        signup_date: {
            $gte: date_begin_variable,
            $lt: date_end_variable
    }},

到目前为止,一切都很好。我现在有一个记录子集,所有这些记录的注册日期都在所需范围内。但这就是我遇到麻烦的地方。现在我想将所有这些记录分组到一个包含所有 ID 列表的结果中。但我不知道如何使用 $group 来做到这一点。

    { $group: {
        _id: null
        users: { $addToSet: user_id }
    }}

])

当我尝试 _id: null 时,我得到了一个空的用户 ID 列表。

我可以使用 find() 返回所需的记录集,然后手动将 ID 处理到列表中,但使用 aggregate() 似乎更干净。我错了吗?使用聚合或不使用聚合来完成我所描述的内容的最佳方法是什么?

最佳答案

试试这个查询:

db.users.aggregate([
  {
    $match: {
      signup_date: {
        $gte: date_begin_variable,
        $lt: date_end_variable
      }
    }
  },
  {
    $group: {
      _id: null,
      users: {
        $addToSet: "$user_id"
      }
    }
  }
])

关于MongoDB聚合: Group all records into a single result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17354271/

相关文章:

javascript - 在不读/写数据库的情况下更新表元素

mysql - Docker - 我的 MySQL 数据库应该位于容器内部还是外部?

mongodb - 如何使用 Presto 查询 MongoDB 中的嵌套字段

node.js - 如何解决 mongodb 上特定集的重复问题

mysql - 如何访问包含点的列名。在选择查询中

java - 当 html post 上没有值传递到 Java Servlet 时,将值设置为 0

python - python 网络服务器上打开的套接字数量不断增加

node.js - 如何在 mongoDB 中编写连接查询..?

node.js - Elastic Beanstalk nginx 代理抛出 502 Bad Gateway

mysql - 当有两个或多个进程同时请求它时,数据库如何决定它应该给哪个进程锁定?