MongoDB return 每个字段的最新记录

MongoDB return the lates record for each field

假设,我有这个 rooms 集合:

{
    room: 'room1',
    owner: 'user1',
    time: 'time1'
},

{
    room: 'room1',
    owner: 'user1',
    time: 'time2'
},

{
    room: 'room2',
    owner: 'user1',
    time: 'time3'
},

{
    room: 'room2',
    owner: 'user1',
    time: 'time4'
},

{
    room: 'room3',
    owner: 'user1',
    time: 'time5'
},

{
    room: 'room3',
    owner: 'user1',
    time: 'time6'
}

在应用程序中我有一组房间:[room1, room2, room3]

如何按时间检索房间数组中每个房间的最新记录?例如查询应该 return this:

{
    room: 'room1',
    owner: 'user1',
    time: 'time2'
},

{
    room: 'room2',
    owner: 'user1',
    time: 'time4'
},

{
    room: 'room3',
    owner: 'user1',
    time: 'time6'
}

使用mongoDBaggregation pipeline

1> 首先符合您的条件。

2> 按 time.

排序

3> 按 room.

分组

4> 项目领域

检查下面的聚合查询:

db.collectionName.aggregate({
  "$match": {
    "room": {
      "$in": ["room1", "room2", "room3"] //macth criteria
    }
  }
}, {
  "$sort": {
    "time": -1 //sort by time 
  }
}, {
  "$group": {
    "_id": "$room", // group by room 
    "room": {
      "$first": "$room" // used mongo $first method
    },
    "owner": {
      "$first": "$owner"
    },
    "time": {
      "$first": "$time"
    }
  }
}, {
  "$project": { //project all fileds
    "_id": 0,
    "room": "$room",
    "owner": "$owner",
    "time": "$time"
  }
})

如果您的 collection 文档大小超过 $sort 需要时间来排序和分组,所以不要使用 $sort,而是使用 $max,如下所示:

db.collectionName.aggregate({
  "$match": {
    "room": {
      "$in": ["room1", "room2", "room3"]
    }
  }
}, {
  "$group": {
    "_id": "$room",
    "time": {
      "$max": "$time" // use $max
    },
    "room": {
      "$first": "$room"
    },
    "owner": {
      "$first": "$owner"
    }
  }
}, {
  "$project": {
    "_id": 0,
    "room": "$room",
    "owner": "$owner",
    "time": "$time"
  }
})