首页 > 解决方案 > 如何将结果从猫鼬分组为较小的子数组

问题描述

我在 mongo 中的数据如下:

{

"name":"XYz",
"type":"A"
}

{
"name":"XYz",
"type":"B"
}

{
"name":"XYz",
"type":"C"
}

{
"name":"XYz",
"type":"C"
}  

假设如果这样做

const alldata=MODEL.find()

我希望我的所有数据结构看起来像:

{
 "A":[
{
"name":"XYz",
"type":"A"
}


],
"B":[
{
"name":"XYz",
"type":"A"
}
],
"C":[
{
"name":"XYz",
"type":"C"
}
,{
"name":"XYz",
"type":"C"
}

]

}

mongoose 中是否有任何直接查询来执行此操作,或者我是否必须通过获取所有对象手动执行此操作,然后相应地进行过滤和聚合?

标签: javascriptnode.jsmongodbrestmongoose

解决方案


您可以使用aggregate()来实现,

  • $group按类型制作根文档数组,
  • $arrayToObject将 k(key) 和 v(value) 格式从数组转换为对象
  • $repalceRoot将上面转换的对象替换为根
YourSchemaName.aggregate([
  {
    $group: {
      _id: "$type",
      root: { $push: "$$ROOT" }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: [[
            {
              k: "$_id",
              v: "$root"
            }
        ]]
      }
    }
  }
])

操场


推荐阅读