【问题标题】:mongodb aggregate with extra info带有额外信息的 mongodb 聚合
【发布时间】:2017-01-24 01:27:38
【问题描述】:

我有一个包含以下文档的 mongo 集合:

{
    "_id" : ObjectId("57697321c22d3917acd66513"),
    "parent" : "AlphaNumericID",
    "signature" : "AnotherAlphaNumericID",
    "price" : 1638,
    "url" : "http://www.thecompany.com/path/to/page1",
    "date" : ISODate("2016-06-21T17:02:20.352Z"),
    "valid" : true
}

我要做的是运行一个查询,该查询将根据签名文件分组,返回最低和最高价格以及相应的网址:

{
        "signature" : "AnotherAlphaNumericID",  
        "min_price" : 1504,
        "min_rent_listing" : "http://www.thecompany.com/path/to/page1",
        "max_price" : 1737,
        "max_price_listing" : "http://www.thecompany.com/path/to/page2",
}

$signature 字段上运行$group 以获得$min$max 是直截了当的,但为了获得实际的url,我将查询分成2,第一个查询使用返回的文档排序列表$signature 价格从最小值到最大值,然后(在 python 代码中)取第一个和最后一个元素。这工作正常,但有一个查询会很好。

想法?

附言

还“玩弄”了一个查询最小值和一个最大值的查询并“压缩”结果。

【问题讨论】:

    标签: mongodb mongodb-aggregation


    【解决方案1】:

    您可以在$group$project 的帮助下耍花招。假设数据集是

    { 
        "_id" : ObjectId("57db28dc705af235a826873a"), 
        "parent" : "AlphaNumericID", 
        "signature" : "AnotherAlphaNumericID", 
        "price" : 1638.0, 
        "url" : "http://www.thecompany.com/path/to/page1", 
        "date" : ISODate("2016-06-21T17:02:20.352+0000"), 
        "valid" : true
    }
    { 
        "_id" : ObjectId("57db28dc705af235a826873b"), 
        "parent" : "AlphaNumericID", 
        "signature" : "AnotherAlphaNumericID", 
        "price" : 168.0, 
        "url" : "http://www.thecompany.com/path/to/page2", 
        "date" : ISODate("2016-06-21T17:02:20.352+0000"), 
        "valid" : true
    }
    { 
        "_id" : ObjectId("57db28dc705af235a826873c"), 
        "parent" : "AlphaNumericID", 
        "signature" : "AnotherAlphaNumericID", 
        "price" : 163.0, 
        "url" : "http://www.thecompany.com/path/to/page3", 
        "date" : ISODate("2016-06-21T17:02:20.352+0000"), 
        "valid" : true
    }
    { 
        "_id" : ObjectId("57db28dc705af235a826873d"), 
        "parent" : "AlphaNumericID", 
        "signature" : "AnotherAlphaNumericID", 
        "price" : 1680.0, 
        "url" : "http://www.thecompany.com/path/to/page4", 
        "date" : ISODate("2016-06-21T17:02:20.352+0000"), 
        "valid" : true
    }
    

    在 shell 中尝试以下查询

    db.collection.aggregate([
       {$sort:{price:1}},
       {$group:{
           _id:"$signature", 
           _first:{$first:"$url"},
           _last:{$last:"$url"}, 
           _min:{$first:"$price"}, 
           _max:{$last:"$price"}}
       },
       {$project:{
         _id:0, 
         min:{
           url:"$_first", 
           price:"$_min"}, 
         max:{
           url:"$_last", 
           price:"$_max"}}
       }
    ])
    

    输出将带有最低/最高价格和相应的网址

    { 
        "min" : {
            "url" : "http://www.thecompany.com/path/to/page3", 
            "price" : 163.0
        }, 
        "max" : {
            "url" : "http://www.thecompany.com/path/to/page4", 
            "price" : 1680.0
        }
    }
    

    我从原来的答案改变了什么: _min:{$min:"$price"}, --> 使用$first _max:{$max:"$price"}} --> 使用$last

    原因:我们按价格升序进入管道。默认情况下,第一条记录为最小值,最后一条记录为最大值。

    【讨论】:

    • 问题:有没有办法运行查询以返回最小值、最大值和最新的?在您的回答中,当我们按价格排序时,第一个/最后一个 = 最小/最大:1。我们可以获取结果,并使用“最新”来“丰富”它,还是我必须坚持两个查询,其中第一个查询是上面的查询和一个单独的查询以按日期排序:-1 并获取第一个结果?
    • 嗯,找到它的最好方法就是试一试。
    • 猜猜不是在一个查询中,因为我需要按最低/最高价格排序。对于最新的,我必须按日期排序。排序不能是“连续的”,而是独立的......
    猜你喜欢
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 2019-03-24
    • 2023-01-12
    • 2023-02-01
    相关资源
    最近更新 更多