【问题标题】:Group collection certain field in one array对一个数组中的特定字段进行分组
【发布时间】:2022-01-26 08:38:32
【问题描述】:

嘿,我有一个如下所示的架构:

{ 
   _id: 1 
   ...
   tokens: [1, 2, 3]
},
{
   _id: 2
   ...
   tokens: [4,5,6]
}

我想将所有项目的所有标记组合在一个数组中,如下所示:

tokens: [1, 2, 3, 4, 5, 6]

我无法做到这一点我已经尝试过,但它没有给我想要的输出:

users = await User.aggregate([
              {
                $group: {
                  _id: "$token",
                  token: { $push: "$token" },
                },
              },
              {
                $project: {
                  token: 1,
                },
              },
            ]);

【问题讨论】:

  • 这在哪方面没有给出你想要的结果?

标签: mongodb mongoose aggregate aggregation


【解决方案1】:

您可以将 group stage 与 $push 运算符结合使用。

例子:

{
      $group:{ _id:null, tokens: { $push : "$tokens" } }
}

【讨论】:

    【解决方案2】:

    解决方案 1

    1. $unwind - 将 tokens 数组解构为多个文档
    2. $group - 按null 分组并使用$push 创建tokens 数组字段。
    db.collection.aggregate([
      {
        $unwind: "$tokens"
      },
      {
        $group: {
          _id: null,
          tokens: {
            "$push": "$tokens"
          }
        },
        
      },
      {
        $project: {
          tokens: 1
        }
      }
    ])
    

    Sample Solution 1 on Mongo Playground


    解决方案 2

    1. $group - 按null 分组并使用$push 创建tokens 数组字段。
    2. $project - 使用 $reduce 删除嵌套数组,但将每个数组中的值添加到 tokens 数组字段中。
    db.collection.aggregate([
      {
        $group: {
          _id: null,
          tokens: {
            "$push": "$tokens"
          }
        }
      },
      {
        $project: {
          tokens: {
            $reduce: {
              input: "$tokens",
              initialValue: [],
              in: {
                $concatArrays: [
                  "$$value",
                  "$$this"
                ]
              }
            }
          }
        }
      }
    ])
    

    Sample Solution 2 on Mongo Playground

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 2018-07-19
      相关资源
      最近更新 更多