当前位置: 首页 > 面试题库 >

$ group by之后的动态键

琴镜
2023-03-14
问题内容

我有以下收藏

{
    "_id" : ObjectId("5b18d14cbc83fd271b6a157c"),
    "status" : "pending",
    "description" : "You have to complete the challenge...",
}
{
    "_id" : ObjectId("5b18d31a27a37696ec8b5773"),
    "status" : "completed",
    "description" : "completed...",
}
{
    "_id" : ObjectId("5b18d31a27a37696ec8b5775"),
    "status" : "pending",
    "description" : "pending...",
}
{
    "_id" : ObjectId("5b18d31a27a37696ec8b5776"),
    "status" : "inProgress",
    "description" : "inProgress...",
}

我需要分组status并动态获取其中的所有密钥status

[
  {
    "completed": [
      {
        "_id": "5b18d31a27a37696ec8b5773",
        "status": "completed",
        "description": "completed..."
      }
    ]
  },
  {
    "pending": [
      {
        "_id": "5b18d14cbc83fd271b6a157c",
        "status": "pending",
        "description": "You have to complete the challenge..."
      },
      {
        "_id": "5b18d31a27a37696ec8b5775",
        "status": "pending",
        "description": "pending..."
      }
    ]
  },
  {
    "inProgress": [
      {
        "_id": "5b18d31a27a37696ec8b5776",
        "status": "inProgress",
        "description": "inProgress..."
      }
    ]
  }
]

问题答案:

并不是说我认为这是个好主意,主要是因为我根本看不到任何“聚合”,是在将“分组”添加到数组后,您可以$push通过"status"分组键将所有类似的内容添加到数组中,然后转换为键在文档的$replaceRoot使用$arrayToObject

db.collection.aggregate([
  { "$group": {
    "_id": "$status",
    "data": { "$push": "$$ROOT" }
  }},
  { "$group": {
    "_id": null,
    "data": {
      "$push": {
        "k": "$_id",
        "v": "$data"
      }
    }
  }},
  { "$replaceRoot": {
    "newRoot": { "$arrayToObject": "$data" }
  }}
])

返回值:

{
        "inProgress" : [
                {
                        "_id" : ObjectId("5b18d31a27a37696ec8b5776"),
                        "status" : "inProgress",
                        "description" : "inProgress..."
                }
        ],
        "completed" : [
                {
                        "_id" : ObjectId("5b18d31a27a37696ec8b5773"),
                        "status" : "completed",
                        "description" : "completed..."
                }
        ],
        "pending" : [
                {
                        "_id" : ObjectId("5b18d14cbc83fd271b6a157c"),
                        "status" : "pending",
                        "description" : "You have to complete the challenge..."
                },
                {
                        "_id" : ObjectId("5b18d31a27a37696ec8b5775"),
                        "status" : "pending",
                        "description" : "pending..."
                }
        ]
}

如果
您实际上事先进行了“汇总”,那可能就可以了,但是在任何实际大小的集合上,所有要做的就是将整个集合强行放入一个文档中,这很可能会超出BSON限制(16MB),所以我只是不建议在此步骤之前,甚至尝试不进行“分组”操作。

坦白地说,以下相同的代码可以完成相同的操作,并且没有聚合技巧,也没有BSON限制问题:

var obj = {};

// Using forEach as a premise for representing "any" cursor iteration form
db.collection.find().forEach(d => {
  if (!obj.hasOwnProperty(d.status))
    obj[d.status] = [];
  obj[d.status].push(d);
})

printjson(obj);

或更短:

var obj = {};

// Using forEach as a premise for representing "any" cursor iteration form
db.collection.find().forEach(d => 
  obj[d.status] = [ 
    ...(obj.hasOwnProperty(d.status)) ? obj[d.status] : [],
    d
  ]
)

printjson(obj);

聚合用于“数据精简”,而任何简单地“重塑结果”却不实际减少从服务器返回的数据的方法通常都可以通过客户端代码更好地处理。无论您做什么,仍将返回所有数据,并且游标的客户端处理的开销要小得多。而且没有限制。



 类似资料:
  • 问题内容: 例如,我有下表: 分组后: 我需要的是删除每个组中的行,其中列中的数量小于组中column的所有行中的最大值。好吧,我在将这个问题翻译和表达为英语时遇到了问题,因此这里是示例: 组中列中的行的最大值: 8 所以我想删除带有索引的行,并保留带有索引的行, 组中列中的行的最大值: 5 所以我想删除带有索引的行并保留带有索引的行 我尝试使用熊猫过滤器功能,但是问题是它一次在组中的所有行上运行

  • 2)在控制器中执行groupby,然后在map中运行由外部库提供的非并行kmeans。 请告诉我还有别的办法,我宁愿尽可能的拥有一切。

  • 我需要下一行中的结果数据帧,以便在groupBy之后的max('diff')列具有别名“maxDiff”。但是,下面的行不会进行任何更改,也不会引发错误。

  • 当我使用或方法时,我得到了错误的结果。 例如: 在另一种方法中,我只得到结果1 我得到了正确的结果。 当使用方法时,我得到了错误的结果。 https://github.com/laravel/framework/issues/14123 忘了说,我的laravel版本信息: 项目中的实际问题 我有一张充电记录表。 1.pay日志表 1.1支付日志talbe数据 2.说明 在pay_log表中,1和

  • 主要内容:1.概述,2.Compiler,3.AdaptiveCompiler,4.AbstractCompiler,5. JavassistCompiler1.概述 在 Java 语言中,大多数情况下,我们已经编写好 Java 类,并编译成 Class 文件进行运行。但是在一些场景下,例如动态代理,需要运用到动态编译的技术 例如,SPI中的 createAdaptiveExtensionClassCode方法中,我们可以看到如下代码: 调用 Compiler#compile(code, cla

  • 本文向大家介绍静态和动态网页之间的区别,包括了静态和动态网页之间的区别的使用技巧和注意事项,需要的朋友参考一下 在互联网冲浪的背景下,网络浏览器(客户端)和网络服务器(服务器)之间存在两方通信。现在,为了规范这种通信,有一些协议(其中最常见的是HTTP协议)允许浏览器在其中进行通信向服务器发送HTTP请求,然后服务器将HTTP响应发送到浏览器。 现在,根据发送到浏览器的响应类型,我们可以将该响应分