Решением является использование group () для группировки записей по дням. Он причудливый, медленный и может блокировать (что означает, что больше ничего не может работать одновременно), но если ваш набор записей не слишком большой, он довольно мощный.
Группа: http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group
Что касается mongoose, я не уверен, поддерживает ли он напрямую group (), но вы можете использовать реализацию node-mongodb-native, выполнив что-то вроде этого (в основном псевдокод):
schema.statics.getLastWeek = function(name, cb) {
var keys = {} // can't remember what this is for
var condition = {} // maybe restrict to last 7 days
var initial = {day1:[],day2:[],day3:[],day4:[],day5:[],day6:[],day7:[]}
var reduce = function(obj, prev) {
// prev is basically the same as initial (except with whatever is added)
var day = obj.date.slice(0,-10) // figure out day, however it works
prev["day" + day].push(obj) // create grouped arrays
// you could also do something here to sort by _id
// which is probably also going to get you the latest for that day
// and use it to replace the last item in the prev["day" + 1] array if
// it's > that the previous _id, which could simplify things later
}
this.collection.group(keys, condition, initial, reduce, function(err, results) {
// console.log(results)
var days = results // it may be a property, can't remember
var lastDays = {}
days.forEach(function(day) {
// sort each day array and grab last element
lastDays[day] = days[day].sort(function(a, b) {
return a.date - b.date // check sort syntax, you may need a diff sort function if it's a string
}).slice(-1) // i think that will give you the last one
})
cb(lastDays) // your stuff
})
}
В моем блоге приведено еще несколько сравнений между группами и картой:
http://j -query.blogspot.com / 2011/06 / MongoDB-производительность группы VS-найти-vs.html
В родном драйвере нет документов по групповой команде, поэтому вам придется просмотреть исходный код здесь:
https://github.com/christkv/node-mongodb-native/blob/master/lib/mongodb/collection.js
Также для сортировки проверьте https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort для точного синтаксиса
Редактировать: Лучшая идея !!!
Просто создайте специальную коллекцию lastRequestOfDay и сделайте _id днем.
Перезаписывайте значение при каждом новом запросе. Это будет очень легко запрашивать и быстро писать и всегда будет иметь последнее записанное значение каждый день!