2015-05-04 43 views
1

想,我有这样的rooms集合:的MongoDB返回鲈记录的每个字段

{ 
    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]

我如何可以检索在房间阵列中的每个房间最新的时间记录?例如查询应该返回:

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

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

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

是'时间'数据类型'字符串'? – Yogesh

+0

时间是时间戳(毫秒) – torayeff

回答

2

使用mongoDB aggregation 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" 
    } 
}) 

如果您收藏的文件大小更然后$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" 
    } 
})