关于mongodb的聚合问题,如何优化呢

发布于 2022-09-05 04:34:06 字数 1177 浏览 13 评论 0

初学mongodb的聚合,略生疏,关于下面这道题

题目:
查询founded_year为2004
含有5个和以上的funding_rounds,
funding_rounds里的raised_amount之和的平均值最小
问这个文档的name是啥

文档大体结构(已略去无关字段):

{
    "_id" : ObjectId("52cdef7c4bab8bd675297d8a"),
    "name" : "Wetpaint",
    "founded_year" : 2005,
    "funding_rounds" : [ 
        {
            "raised_amount" : 5250000
        }, 
        {
            "raised_amount" : 9500000
        }, 
        {
            "raised_amount" : 25000000
        }
    ]
}

我的解答如下(已验证结果是正确的):
现想问:我的这个写法是否很冗余,有没有更优化的聚合写法呢?
因为初学,没接触太多聚合符,所以请求拓展

db.getCollection('companies').aggregate([
{
    $match:{
        'founded_year':{$eq:2004}
    }
},
{
    $project:{
     
        'funding_rounds':'$funding_rounds',
        'funding_rounds_size':{$size:'$funding_rounds'}
    }
},
{
    $match:{
        'funding_rounds_size':{$gte:5}
    }
},
{
    $unwind:'$funding_rounds'
},
{
    $group:{
        _id:"$_id",
        'num':{$avg:'$funding_rounds.raised_amount'}
   }
},
{
    $sort:{
        'num':1
    }
}
])

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

濫情▎り 2022-09-12 04:34:06

我也是初学一周这样,不知道还有不有更好的写法

源数据

db.test3.insert([
{
    "name" : "Wetpaint",
    "founded_year" : 2004,
    "funding_rounds" : [ 
        {
            "raised_amount" : 5250000
        }, 
        {
            "raised_amount" : 9500000
        }, 
        {
            "raised_amount" : 25000000
        }, 
        {
            "raised_amount" : 9500000
        }, 
        {
            "raised_amount" : 25000000
        }
    ]
},{
    "name" : "Wddddt",
    "founded_year" : 2004,
    "funding_rounds" : [ 
        {
            "raised_amount" : 5250000
        }, 
        {
            "raised_amount" : 9500000
        }, 
        {
            "raised_amount" : 25000000
        }
    ]
},
{
    "name" : "Wcccct",
    "founded_year" : 2004,
    "funding_rounds" : [ 
        {
            "raised_amount" : 520000
        }, 
        {
            "raised_amount" : 900000
        }, 
        {
            "raised_amount" : 2500000
        }, 
        {
            "raised_amount" : 950000
        }, 
        {
            "raised_amount" : 25000000
        }
    ]
},{
    "name" : "Wetaaat",
    "founded_year" : 2004,
    "funding_rounds" : [ 
        {
            "raised_amount" : 5250000
        }, 
        {
            "raised_amount" : 9500000
        }, 
        {
            "raised_amount" : 25000000
        }
    ]
}
])

sql

db.getCollection('test3').aggregate([
{
    $project: {
        'name': 1,
        'founded_year': 1,    
        'funding_rounds': 1,
        'funding_rounds_size': {$size: '$funding_rounds'},
        'funding_rounds_avg': {$avg: '$funding_rounds.raised_amount'}
    }
},{
    $match: {
        'founded_year': 2004,
        'funding_rounds_size': {$gte: 5}
    }
},{
    $sort: {
        'funding_rounds_avg': 1
    }
}
])

感觉这种查询方法会好点,虽然写的有点多,不过效率应该快点

db.getCollection('test3').aggregate([
{
  $match: {
      'founded_year': 2004
      }  
},{
    $project: {
        'name': 1,
        'founded_year': 1,    
        'funding_rounds': 1,
        'funding_rounds_size': {$size: '$funding_rounds'},
        'funding_rounds_avg': {$avg: '$funding_rounds.raised_amount'}
    }
},{
    $match: {
        'funding_rounds_size': {$gte: 5}
    }
},{
    $sort: {
        'funding_rounds_avg': 1
    }
}
])
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文