Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何按employeeId、itemId和tranDate分组显示一个项目行和tranDate?_Mongodb_Aggregate - Fatal编程技术网

Mongodb 如何按employeeId、itemId和tranDate分组显示一个项目行和tranDate?

Mongodb 如何按employeeId、itemId和tranDate分组显示一个项目行和tranDate?,mongodb,aggregate,Mongodb,Aggregate,大家好我需要帮助我有下面的集合,我想按员工ID、项目ID和tranDate进行分组 这是我的收藏 let colection = [ { tranDate: '2020/3/15', employeeId: '001', itemId: '001', qty: 10 }, { tranDate: '2020/3/15', employeeId: '001', itemId: '001', qty: 20 }, { tranD

大家好我需要帮助我有下面的集合,我想按员工ID项目IDtranDate进行分组

这是我的收藏

let colection = [
{
    tranDate: '2020/3/15',
    employeeId: '001',
    itemId: '001',
    qty: 10
},
{
    tranDate: '2020/3/15',
    employeeId: '001',
    itemId: '001',
    qty: 20
},
{
    tranDate: '2020/3/16',
    employeeId: '001',
    itemId: '002',
    qty: 100
},
{
    tranDate: '2020/3/16',
    employeeId: '001',
    itemId: '001',
    qty: 60
}
]
我希望我的收藏是这样的,你可以看到相同的employeeId、itemId、tranDate

//结果

let newcolection = [
{

    employeeId: '001',
    itemId: '001',
    itemArr: [{ tranDate: '2020/3/15', qty: 30 }, { tranDate: '2020/3/16', qty: 60 }]
},

{

    employeeId: '001',
    itemId: '002',
    itemArr: [{ tranDate: '2020/3/15', qty: 0 }, { tranDate: '2020/3/16', qty: 100 }]
},
]

下面是一条管道,它应该满足您的需要:

[
{$group: {
  _id: {
    employeeId: '$employeeId',
    itemId: '$itemId',
    tranDate: '$tranDate'
  },
  qty: {
    $sum: '$qty'
  },
  employeeId: {
    $first: '$employeeId'
  },
  itemId: {
    $first: '$itemId'
  },
  tranDate: {
    $first: '$tranDate'
  }
}}, 
{$project: {
  employeeId: 1,
  itemId: 1,
  myObject: {
    tranDate: "$tranDate",
    qty: "$qty"
  }
}}, 
{$group: {
  _id: {employeeId: '$employeeId',
    itemId: '$itemId'},
    itemArray: {
      $push: "$myObject"
    }

}}, 
{
    $project: {
        _id: 0,
        employeeId: "$_id.employeeId",
        itemId: "$_id.itemId",
        itemArray: 1
    }
}, {
    $out: 'newcollection'
}]
第一个$group阶段按员工id、物料id和交易日期对文档进行分组,以计算数量

第一个$project阶段将事务日期和数量移动到名为myObject的对象中

下一个$group阶段按员工id和项目id对文档进行分组,以便创建一个itemArray,其中包含每个交易日期的对象

下一个$project阶段将员工id和项目id移出\u id

最后一个$out阶段将管道的结果存储在一个名为newcollection的集合中

{"_id":{"$oid":"5e70c1e378117090fe4b6ed7"},"itemArray":[{"tranDate":{"$date":{"$numberLong":"1584331200000"}},"qty":{"$numberInt":"100"}}],"employeeId":"001","itemId":"002"}

{"_id":{"$oid":"5e70c1e378117090fe4b6ed8"},"itemArray":[{"tranDate":{"$date":{"$numberLong":"1584244800000"}},"qty":{"$numberInt":"30"}},{"tranDate":{"$date":{"$numberLong":"1584331200000"}},"qty":{"$numberInt":"60"}}],"employeeId":"001","itemId":"001"}
以下是存储在newcollection中的文档

{"_id":{"$oid":"5e70c1e378117090fe4b6ed7"},"itemArray":[{"tranDate":{"$date":{"$numberLong":"1584331200000"}},"qty":{"$numberInt":"100"}}],"employeeId":"001","itemId":"002"}

{"_id":{"$oid":"5e70c1e378117090fe4b6ed8"},"itemArray":[{"tranDate":{"$date":{"$numberLong":"1584244800000"}},"qty":{"$numberInt":"30"}},{"tranDate":{"$date":{"$numberLong":"1584331200000"}},"qty":{"$numberInt":"60"}}],"employeeId":"001","itemId":"001"}

抱歉,我混淆了我的问题请在更新后查看我的问题。我更新了我的答案,以表明您可以使用$out将结果存储在集合中。请提供更多示例代码,我尝试了,但仍然存在相同的问题谢谢您,但当我使用{$out:'newcollection'}stage it show nothing records在$out之前,您的聚合管道是否在stage中生成结果?我强烈推荐MongoDB Atlas或MongoDB Compass中的可视化管道生成器。它们允许您查看每个阶段的示例输出。也许我给一个字段命名的方式与您的稍有不同,所以您不会得到结果。