Подтвердить что ты не робот

Запрос на получение последних данных за X минут с помощью Mongodb

Я начинаю с mongodb, и я пытаюсь запросить мой db, который имеет этот формат документа:

{ "_id" : ObjectId("520b8b3f8bd94741bf006033"), "value" : 0.664, "timestamp" : ISODate("2013-08-14T13:48:35Z"), "cr" : ISODate("2013-08-14T13:50:55.834Z") }

Я могу получить последние записи из datetime с этим запросом:

> db.mycol.find({timestamp:{$gt: ISODate("2013-08-14T13:48:00Z")}}).sort({x:1});

Но я пытаюсь получить набор с полями значений и временными метками с 18 минут назад, как я могу построить запрос для этого? Спасибо всем за ваше терпение...

4b9b3361

Ответ 1

В течение 18 минут, это не совсем о MongoDB, но о JavaScript и том, что доступно в оболочке mongo:

query = {
    timestamp: { // 18 minutes ago (from now)
        $gt: new Date(ISODate().getTime() - 1000 * 60 * 18)
    }
}

Работает в оболочке mongo, но использование драйверов Mongo для других языков будет действительно другим.

"Проецировать" по меньшей схеме с двумя значениями и метками времени:

projection = {
    _id: 0,
    value: 1,
    timestamp: 1,
}

Применение обоих:

db.mycol.find(query, projection).sort({timestamp: 1});

Ну, это еще не "набор", поскольку могут быть дубликаты. Чтобы избавиться от них, вы можете использовать $group из структуры агрегации:

db.mycol.aggregate([
    {$match: query},
    {$group: {
        _id: {
            value: "$value",
            timestamp: "$timestamp",
        }
    }},
    {$project: {
        value: "$_id.value",
        timestamp: "$_id.timestamp",
    }},
    {$sort: {timestamp: 1}},
])

Ответ 2

Ничего себе, благодаря @Alistair_Nelson, я смог получить данные с n минут назад, например, чтобы получить последние 18 минут от ISODate ( "2013-08-14T14: 00: 00Z" ):

db.mycol.find({timestamp:{$gt: new Date(ISODate("2013-08-14T14:00:00Z")-18*60000)}})

Чтобы получить только нужные мне поля:

db.mycol.find({timestamp:{$gt: new Date(ISODate("2013-08-14T14:00:00Z")-18*60000)}},{value:1,timestamp:1, _id:0})