Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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
Java 如何使用聚合合并包含timeseries数据数组的两个或多个文档?_Java_Mongodb - Fatal编程技术网

Java 如何使用聚合合并包含timeseries数据数组的两个或多个文档?

Java 如何使用聚合合并包含timeseries数据数组的两个或多个文档?,java,mongodb,Java,Mongodb,我希望合并两个或多个文档,以便将这些选定文档中的timeseries数据合并到一个文档中,例如,如果数据在该时间戳不存在,则该数据应为null 以下是文档(可以有多个文档):- 文件1:- { "unit_id":38, "mac_id":"abcdefghijkl", "data":{ "ch1":[21,22,31,31,22,11], "ch2":[55,55,56,57,88,90] }, "updatetime":["2019

我希望合并两个或多个文档,以便将这些选定文档中的timeseries数据合并到一个文档中,例如,如果数据在该时间戳不存在,则该数据应为null

以下是文档(可以有多个文档):-

文件1:-

{
  "unit_id":38,
  "mac_id":"abcdefghijkl",
  "data":{
          "ch1":[21,22,31,31,22,11],
          "ch2":[55,55,56,57,88,90]
  },
  "updatetime":["2019-07-15 17:20:16",
"2019-07-15 17:20:23",
"2019-07-15 17:21:23",
"2019-07-15 17:22:23",
"2019-07-15 17:23:25",
"2019-07-15 17:24:25"]
}
文件2:-

{
  "unit_id":39,
  "mac_id":"abcdefgavdca",
  "data":{
          "ch1":[43.21,55.12,44.21,66.21,11.21,22.10]

  },
  "updatetime":["2019-07-15 17:25:00",
"2019-07-15 17:26:23",
"2019-07-15 17:27:23",
"2019-07-15 17:28:23",
"2019-07-15 17:29:25",
"2019-07-15 17:30:25"]
}
文件3:-

{
  "unit_id":40,
  "mac_id":"abcdefgzxcvs",
  "data":{
          "ch1":[21,22,31,31,22,11],

  },
  "updatetime":["2019-07-15 17:35:16",
"2019-07-15 17:36:23",
"2019-07-15 17:37:23",
"2019-07-15 17:38:23",
"2019-07-15 17:39:25",
"2019-07-15 17:40:25"]
}
结果应该是这样的:-

updatetime           ch1[d1]  ch2[d1]  ch1[d2]  ch1[d3]
2019-07-15 17:20:16   21        55       nan        nan
2019-07-15 17:20:23   22        55       nan        nan
2019-07-15 17:21:23   31        56       nan        nan
2019-07-15 17:22:23   31        57       nan        nan
2019-07-15 17:23:25   22        88       nan        nan
2019-07-15 17:24:25   11        90       nan        nan
2019-07-15 17:25:00   nan       nan      43.21      nan
2019-07-15 17:26:23   nan       nan      55.12      nan
2019-07-15 17:27:23   nan       nan      44.21      nan
2019-07-15 17:28:23   nan       nan      66.21      nan
2019-07-15 17:29:25   nan       nan      11.21      nan
2019-07-15 17:30:25   nan       nan      22.1       nan
2019-07-15 17:35:16   nan       nan      nan        21
2019-07-15 17:36:23   nan       nan      nan        22
2019-07-15 17:37:23   nan       nan      nan        31
2019-07-15 17:38:23   nan       nan      nan        31
2019-07-15 17:39:25   nan       nan      nan        22
2019-07-15 17:40:25   nan       nan      nan        11

如何实现上述结果,我认为我应该使用聚合查询,但我没有任何使用它的经验。

不完全如此,但您可以随时使用json。 它将为您提供实现所需的所有数据

db.collection.aggregate([
    {
        $project: {
            unit_id: true,
            updatetime: true,
            data: { $objectToArray: "$data" },
        }
    },
    {
        $project: {
            mydata: {
                $map: {
                    input: "$updatetime",
                    as: "input",
                    in: {
                        unit_id: "$unit_id",
                        date: "$$input",
                        data: {
                            $arrayToObject: {
                                $map: {
                                    input: "$data",
                                    as: "newInput",
                                    in: {
                                        k: "$$newInput.k",
                                        v: { $ifNull: [{ $arrayElemAt: ["$$newInput.v", { $indexOfArray: ["$updatetime", "$$input"] }] }, "nan"] }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    {
        $unwind: "$mydata"
    },
    {
        $group: {
            _id: "result",
            data: {
                $push: "$mydata"
            }
        }
    }
])
响应
不完全是这样,但您可以随时使用json。 它将为您提供实现所需的所有数据

db.collection.aggregate([
    {
        $project: {
            unit_id: true,
            updatetime: true,
            data: { $objectToArray: "$data" },
        }
    },
    {
        $project: {
            mydata: {
                $map: {
                    input: "$updatetime",
                    as: "input",
                    in: {
                        unit_id: "$unit_id",
                        date: "$$input",
                        data: {
                            $arrayToObject: {
                                $map: {
                                    input: "$data",
                                    as: "newInput",
                                    in: {
                                        k: "$$newInput.k",
                                        v: { $ifNull: [{ $arrayElemAt: ["$$newInput.v", { $indexOfArray: ["$updatetime", "$$input"] }] }, "nan"] }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    {
        $unwind: "$mydata"
    },
    {
        $group: {
            _id: "result",
            data: {
                $push: "$mydata"
            }
        }
    }
])
响应
可能有多少个
通道
,如ch1、ch2?1.从所有文件中提取所有时间戳并将其列出2。检查每一份文件并填写频道的可用时间戳channel@ShivamMishra我猜不出来。像ch1、ch2这样的频道可能有多少?1.从所有文件中提取所有时间戳并将其列出2。检查每一份文件并填写频道的可用时间戳channel@ShivamMishra我猜不出来。有唯一id的列表,请参阅所有三个文档“unit_id”是唯一id,我添加了
unit_id
,并更新了答案。请先检查
project
pipeline,然后检查第二个
project
pipeline中的
map
函数。这没问题,我知道了,但假设我想在操作符[38,39,40]中使用$in。这样我只得到了三个单位id的聚合数据。是否需要按
unit\u id
查询或过滤数据?实际上两者都是,仅筛选选定的数据,即[38,39,40]存在唯一id列表,请参阅所有三个文档“unit_id”是唯一id,我添加了
unit_id
,并更新了答案。请先检查
project
pipeline,然后检查第二个
project
pipeline中的
map
函数。这没问题,我知道了,但假设我想在操作符[38,39,40]中使用$in。这样我只得到了三个单位id的聚合数据。是否需要按
unit\u id
查询或过滤数据?实际上两者都是,仅对选定数据进行过滤,即[38,39,40]