Mongodb:如何基于id聚合来自不同集合的数据

Mongodb:如何基于id聚合来自不同集合的数据,mongodb,Mongodb,我有一个文档,其中的数据类似于 收藏A { "_id" : 69.0, "values" : [ { "date_data" : "2016-12-16 10:00:00", "valueA" : 8, "valuB" : 9 }, { "date_data" : "2016-12-16 11:00:00", "valueA" : 8, "valuB" : 9

我有一个文档,其中的数据类似于
收藏A

{  
 "_id" : 69.0,  
"values" : [ 
    {
        "date_data" : "2016-12-16 10:00:00",
        "valueA" : 8,
        "valuB" : 9
    }, 
    {
        "date_data" : "2016-12-16 11:00:00",
        "valueA" : 8,
        "valuB" : 9
    },.......
   }
B组

{  
 "_id" : 69.0,  
"values" : [ 
    {
        "date_data" : "2017-12-16 10:00:00",
        "valueA" : 8,
        "valuB" : 9
    }, 
    {
        "date_data" : "2017-12-16 11:00:00",
        "valueA" : 8,
        "valuB" : 9
    },.......
   }
数据每小时存储一次,因为它存储在一个文档中,在某个点上可能会达到16Mb的限制,这就是为什么我考虑将数据跨年传播,这意味着在一个集合中,所有id都将每年保存数据。但当我们想要显示合并的数据时,我们如何使用聚合函数呢


例如,collectionA拥有2016年12月7日至2017年12月7日的数据,collectionB拥有2015年12月6日至2016年12月6日的数据。我如何显示2016年12月1日至2017年1月1日之间不同集合中的数据

非常简单,使用mongodb$lookup查询,它相当于左外部联接。左侧的所有文档都将在字段内扫描一个值,右侧的文档将认为外来文档在值方面匹配。对于您的情况,这里是父集合

父级A

子集合B

现在我们所要做的就是从集合a中进行查询

通过一个非常简单的聚合$lookup查询,您将看到以下结果

记住几件事

  • 用于查找的本地字段不关心是否为其编制了索引,因此在行数最少的表上运行它
  • 外部字段在索引或直接在_id上时效果最佳
  • 有一个选项可以指定管道并在匹配时执行一些自定义过滤工作,我不推荐使用它,因为管道的速度慢得可笑
  • 如果要聚合大量数据,请不要忘记“allowDiskUse”

  • 尝试将所有数据存储在单个集合中,并将数据分散到不同的文档中,然后创建一个键,以便根据需要的粒度将它们关联起来。对于每个文档,您可以添加一个包含元数据(如年、月等)的字段,因为您知道该文档中存储了哪些内容以供查询。@Veeram,谢谢您的建议,但如果我们存储在不同的文档中,问题仍然是一样的,如何使用聚合查询显示数据,如果数据分布在文档中?您可以查询字段的元数据以查找所需的数据。只需构建过滤器和查询。构建过滤器的工作量很小,但可以避免获取整个嵌入式阵列。例如,
    2016年12月1日至2017年12月31日
    您可以使用filter
    {$and:[{year:16,month:12},{year:17,{month:{$gt:0,$lte:12}}]}
    @Veeram查询所有文档,这意味着如果我使用{id:69.0,我需要更改{u id使其成为timestamo,这样它就不会给出重复的密钥错误,然后使用,匹配:指标(id)和年份、元数据和过滤器使用“值”分组以获得结果,对吗?
    db.getCollection('uniques').aggregate([
    
        {
            "$lookup": {
                "from": "values",//Get data from values table
                "localField": "_id", //The field _id of the current table uniques
                "foreignField": "parent_id", //The foreign column containing a matching value
                "as": "related" //An array containing all items under 69
            }
        },
        {
            "$unwind": "$related" //Unwind that array
        },
        {
            "$project": {
                "value_id": "$related._id",//project only what you need
                "date": "$related.date_data",
                "a": "$related.valueA",
                "b": "$related.valueB"
            }
        }
    
    ], {"allowDiskUse": true})