如何按日期获取唯一约束的最早记录?

Bra*_*ley 5 mongodb mongodb-query

我有一个集合,其中包含对这个问题很重要的两个字段:类别和日期(为简单起见,我将仅使用“昨天”和“今天”)。

// Sample Data
{ category: 1, date: ISODate("yesterday") } 
{ category: 1, date: ISODate("today") }
{ category: 2, date: ISODate("yesterday") } 
{ category: 2, date: ISODate("today") }
{ category: 3, date: ISODate("yesterday") } 
Run Code Online (Sandbox Code Playgroud)

现在,我正在修改一个查询,该查询将首先查询类别,然后按日期降序排序,并限制为 1 个结果(按日期为我提供单个类别的最早记录。

db.collection("things").find({ category: 1 }).sort({ date: -1 }).limit(1)

// Result
{ category: 1, date: ISODate("today") }
Run Code Online (Sandbox Code Playgroud)

效果很好。但是,我想要每个类别的最早记录。这意味着我无法使用限制运算符(因为我不知道在任何给定时间点有多少个类别),并且我不能保证每个类别每天都有日期记录。

// Expected Result
{ category: 1, date: ISODate("today") }
{ category: 2, date: ISODate("today") }
{ category: 3, date: ISODate("yesterday") } 
Run Code Online (Sandbox Code Playgroud)

我玩过不同的游戏,但没有成功。

如何在单个查询中获取每个类别的最早日期的记录?

mic*_*ckl 2

您可以$group通过category并使用$max来获取最早的日期:

db.things.aggregate([
    {
        $group: {
            _id: "$category",
            date: { $max: "$date" }
        }
    },
    {
        $project: {
            _id: 0,
            category: "$_id",
            date: 1
        }
    }
])
Run Code Online (Sandbox Code Playgroud)