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"
}
})
假设,我有这个 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"
}
})