Javascript 在MongoDB中获取聚合数据

Javascript 在MongoDB中获取聚合数据,javascript,database,mongodb,aggregation-framework,Javascript,Database,Mongodb,Aggregation Framework,下面是上图中提供的mongo DB文档结构。在这里,您可以看到我们在pages array下有一个xmlRequests数组(pages是对象数组)。因此,每个会话都有包含一些对象的pages数组 我想做什么: { pages : [] // array containing all the objects of request arrays under each session. } 假设我们有10个与上图所示结构相同的文档。我想要一个数组中所有会话下所有页面的聚合(统一)数组。简单地说,

下面是上图中提供的mongo DB文档结构。在这里,您可以看到我们在pages array下有一个xmlRequests数组(pages是对象数组)。因此,每个会话都有包含一些对象的pages数组

我想做什么:

{
 pages : [] // array containing all the objects of request arrays under each session.
}
假设我们有10个与上图所示结构相同的文档。我想要一个数组中所有会话下所有页面的聚合(统一)数组。简单地说,我想要一个数组中所有会话的pages数组(聚合)

像这样:

{
 pages : [] // array containing all the objects of request arrays under each session.
}
我需要一个统一的requests[]数组,其中包含单个数组中所有会话的所有请求。我尝试使用db.collection.aggregate([])但我不知道如何获取文档中的嵌套值,并将它们统一到一个对象数组中

Mongo代码段

{
 "user": "abc",
 "sessions": {
 "12345": {
    "pages": [
        {
            requests: [ {name: 'request1'}]
        }
    ]
    },
  "23456": {
    "pages": [
        {
            requests: [ {name: 'request1'}]
        }
    ]
    }
    }
}

{
  "user": "xyz",
  "sessions": {
  "12345": {
    "pages": [
        {
            requests: [ {name: 'request1'}]
        }
    ]
    },
   "23456": {
    "pages": [
        {
            requests: [ {name: 'request1'}]
        }
    ]
     }
    }
   }

获取集合中的所有请求数组并将它们合并到一个数组中

尝试一下。基本上,我们展开第一个数组页面,这样我们就得到了一个巨大的页面列表。然后,我们将所有xml请求数组分组到一个大数组中。然后我们将它们合并到一个数组中,并返回一个包含最终数组的键的对象

    .aggregate([{
         $unwind: “$pages”,
    },
    {
         $group: {
              _id: null,
              xmlRequests: { $push: "$xmlRequests"}
          }
    },
    {
        $project: {
             _id: 0,
             requests: {
                $reduce: {
                    input: "$xmlRequests",
                    initialValue: [],
                     in: {
                         $concatArrays: [ "$$this", "$$value"]
                     }
                 }
             }
         }
    }])
可以从开始,以便从未知键检索值。然后,需要两个/对来展平阵列阵列。可用于将所有请求收集到单个文档中:

db.collection.aggregate([
    {
        $project: {
            pages: {
                $reduce: {
                    input: { $objectToArray: "$sessions" },
                    initialValue: [],
                    in: {
                        $concatArrays: [
                            "$$value",
                            {
                                $reduce: {
                                    input: "$$this.v.pages",
                                    initialValue: [],
                                    in: { $concatArrays: [ "$$value", "$$this.requests" ] }
                                }
                            }
                        ]
                    }
                }
            }
        }
    },
    {
        $group: {
            _id: null,
            pages: { $push: "$pages" }
        }
    },
    {
        $project: {
            pages: {
                $reduce: {
                    input: "$pages",
                    initialValue: [],
                    in: { $concatArrays: [ "$$value", "$$this" ] }
                }
            }
        }
    }
])

能否将样本数据粘贴为代码而不是图像?谢谢@mickl你能检查一下我添加了什么吗?你想要每个用户的所有会话还是一个包含所有用户会话的文档?@mickl一个包含所有会话id页面下所有请求的文档。不是会话,而是每个会话的pages数组中的请求对@mickl有很大帮助