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

时间:2017-12-08 17:24:58

标签: 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
    },.......
   }

收集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日到17日的数据,而collectionB具有从2016年12月15日到2016年6月6日的数据。我如何才能在不同的收集中显示2016年1月12日至1月1日之间的数据?

1 个答案:

答案 0 :(得分:1)

非常简单,使用mongodb $ lookup查询,它相当于左外连接。将扫描左侧的所有文档以获取字段内的值,并且右侧的文档将被视为外部文档将与值相匹配。对于您的情况,这是父集合

家长A

enter image description here

儿童收藏B

enter image description here

现在我们所要做的就是从集合A

进行查询

使用非常简单的聚合$ lookup查询,您将看到以下结果 enter image description here

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})

记住一些事情

  1. 如果您已将索引编入索引,则查找的本地字段并不关心,因此在具有最少行数的表上运行
  2. 外国字段在索引时或在_id
  3. 上直接效果最佳
  4. 有一个选项可以指定一个管道并在匹配时进行一些自定义过滤工作,我不会推荐它,因为管道很慢很慢
  5. 如果要汇总大量数据,请不要忘记“allowDiskUse”