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

问题描述 投票:0回答:1

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

mongodb
1个回答
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. 如果要聚合大量数据,请不要忘记“allowDiskUse”
© www.soinside.com 2019 - 2024. All rights reserved.