代码之家  ›  专栏  ›  技术社区  ›  Andrzej

从分组文档中获取最后一个值和最小值

  •  1
  • Andrzej  · 技术社区  · 5 年前

    我的文档模型如下:

    {
        "model": "ABC123",
        "date": "2018-12-24T23:00:00.000+0000",
        "price": "2000" ,
    }
    

    我要检索集合以获取文档数组:

    [
      { "_id" : "ABC123", "newestDate" : ISODate("2018-12-26T23:00:00Z"), "newestPrice" : 2801.33, "lowestPriceAtAll": 1300 }, 
    { "_id" : "ABC124", "newestDate" : ISODate("2018-12-26T23:00:00Z"), "newestPrice" : 2801.33, "lowestPriceAtAll": 990}
    ]
    

    哪里 _id model 字段, newestPrice 是最新文档的价格(按 模型 ) lowestPriceAtAll 是所有相同文件的最低价格 模型 .

    我询问了两个问题。 首先是找到最低价格的文件:

       offers.aggregate([ 
            { $sort: { "model": 1, "price": 1 }}, 
            { 
                $group: { 
                    _id: "$model", 
                    lowestPrice: { "$first": "$price" },
                    lowestPriceDate: { "$first": "$date"},
                }
            }
        ])
    

    第二种方法是找到最新的文档:

    offers.aggregate([ 
            { $sort: { "model": 1, "date": -1 }}, 
            { 
                $group: { 
                    _id: "$model", 
                    newestDate: { "$first": "$date" },
                    newestPrice: { "$first": "$price"},
                }
            }
        ])
    

    是否可以将这两个查询合并为一个查询?(最重要的是文件必须按 模型 字段)。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Saravana    5 年前

    你可以使用 $facet

    db.offers.aggregate([ 
        {$facet :{
            lowest: [
                { $sort: { "model": 1, "price": 1 }}, 
                { 
                    $group: { 
                        _id: "$model", 
                        lowestPrice: { "$first": "$price" },
                        lowestPriceDate: { "$first": "$date"},
                    }
                }
                ],
            newest: [
                { $sort: { "model": 1, "date": -1 }}, 
                { 
                    $group: { 
                        _id: "$model", 
                        newestDate: { "$first": "$date" },
                        newestPrice: { "$first": "$price"},
                    }
                }
            ]
        }}
    ])