Mongodb 如何按employeeId、itemId和tranDate分组显示一个项目行和tranDate?
大家好我需要帮助我有下面的集合,我想按员工ID、项目ID和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
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中的可视化管道生成器。它们允许您查看每个阶段的示例输出。也许我给一个字段命名的方式与您的稍有不同,所以您不会得到结果。