问题描述
{
"testing": {
"total": 360,"status": "testing","books": [
{
"book": "john goes to school","authors": [
"john@gmail.com"
]
}
],},"dev": {
"total": 863,"status": "dev","books": [
{
"book": "bob makes a book","authors": [
"bob@gmail.com",]
}
]
},"prod": {
"total": 1,"status": "prod","flags": [
{
"book": "nancy writes an essay","authors": [
"nancy@gmail.com"
]
}
]
}
}
]
我想把它展平成这样:
{
"books":[
{
"book":"john goes to school","authors":[
"john@gmail.com"
],"status":"testing"
},{
"book":"bob makes a book","authors":[
"bob@gmail.com"
],"status":"dev"
},{
"book":"nancy writes an essay","authors":[
"nancy@gmail.com"
],"status":"prod"
}
]
}
到目前为止,我要使它看起来最接近的最好方法就是使用它
db.collection.aggregate([
{
$project: {
_id: 0,dev: "$dev.books",test: "$test.books",prod: "$prod.books"
}
}
我尝试使用$ unwind,$ map和$ reduce的组合,但不确定如何理解它。基本上,我一直在尝试展平数组,并将状态附加到每个记录 任何帮助将不胜感激,谢谢
解决方法
尝试此汇总-
db.collection.aggregate([
{
"$match": {
"_id": 0
}
},{
"$project": {
"_id": 0
}
},{
"$project": {
"arr": {
"$objectToArray": "$$ROOT"
}
}
},{
"$unwind": "$arr"
},{
"$set": {
"arr.v.books.status": "$arr.v.status"
}
},{
"$group": {
"_id": "$_id","books": {
"$addToSet": "$arr.v.books"
}
}
}
])