retornar consulta com base na data


209

Eu tenho dados como este no mongodb

{ 
    "latitude" : "", 
    "longitude" : "", 
    "course" : "", 
    "battery" : "0", 
    "imei" : "0", 
    "altitude" : "F:3.82V", 
    "mcc" : "07", 
    "mnc" : "007B", 
    "lac" : "2A83", 
    "_id" : ObjectId("4f0eb2c406ab6a9d4d000003"), 
    "createdAt" : ISODate("2012-01-12T20:15:31Z") 
}

Como faço para consultar db.gpsdatas.find({'createdAt': ??what here??}), para que ele me devolva o resultado dos dados acima do banco de dados?


teria sido eficaz para ter mencionado que NodeJS biblioteca que você estava usando, mas com base no exemplo parece que seus mongoosejs
Grimnoff

Respostas:


421

Você provavelmente deseja fazer uma consulta de intervalo, por exemplo, todos os itens criados após uma determinada data:

db.gpsdatas.find({"createdAt" : { $gte : new ISODate("2012-01-12T20:15:31Z") }});

Estou usando $gte(maior ou igual a), porque isso geralmente é usado para consultas somente de data, onde o componente de horário é 00:00:00.

Se você realmente deseja encontrar uma data igual a outra data, a sintaxe seria

db.gpsdatas.find({"createdAt" : new ISODate("2012-01-12T20:15:31Z") });

14
Ahh :) Pensei que você estivesse usando o console Mongo. Existe ISODateum wrapper para o objeto js Date. Tente algo parecido "createdAt" : new Date("2010-01-01"). Por alguma razão, esse código não funciona (para a versão 2.0.2) no console Mongo, no entanto.
Mnemosyn

A inicialização da data usaria barras em vez de hífens? assim:new Date("2010/01/01");
Victor S

16

se você quiser obter itens em qualquer lugar nessa data, precisará comparar duas datas

Você pode criar duas datas fora da primeira assim, para começar o dia e o fim do dia.

var startDate = new Date(); // this is the starting date that looks like ISODate("2014-10-03T04:00:00.188Z")

startDate.setSeconds(0);
startDate.setHours(0);
startDate.setMinutes(0);

var dateMidnight = new Date(startDate);
dateMidnight.setHours(23);
dateMidnight.setMinutes(59);
dateMidnight.setSeconds(59);

### MONGO QUERY

var query = {
        inserted_at: {
                    $gt:morning,
                    $lt:dateScrapedMidnight
        }
};

//MORNING: Sun Oct 12 2014 00:00:00 GMT-0400 (EDT)
//MIDNIGHT: Sun Oct 12 2014 23:59:59 GMT-0400 (EDT)

16

Acabei de implementar algo semelhante no Mongo v3.2.3 usando o Node v0.12.7 e v4.4.4 e usei:

{ $gte: new Date(dateVar).toISOString() }

Estou passando um ISODate (por exemplo, 2016-04-22T00: 00: 00Z) e isso funciona para uma consulta .find () com ou sem a função toISOString. Mas ao usar em uma consulta .aggregate () $ match, ela não gosta da função toISOString!


12

Se você deseja obter todas as novidades nos últimos 5 minutos, precisará fazer alguns cálculos, mas não é difícil ...

Primeiro, crie um índice na propriedade com a qual você deseja corresponder (inclua a direção de classificação -1 para decrescente e 1 para ascendente)

db.things.createIndex({ createdAt: -1 }) // descending order on .createdAt

Em seguida, consulte os documentos criados nos últimos 5 minutos (60 segundos * 5 minutos) .... porque o javascript .getTime()retorna milissegundos, você precisa multiplicar por 1000 antes de usá-lo como entrada para o new Date()construtor.

db.things.find({
        createdAt: {
            $gte: new Date(new Date().getTime()-60*5*1000).toISOString()
         }
     })
     .count()

A explicação para new Date(new Date().getTime()-60*5*1000).toISOString()é a seguinte:

Primeiro, calculamos "5 minutos atrás":

  1. new Date().getTime() nos fornece o tempo atual em milissegundos
  2. Queremos subtrair 5 minutos (em ms) do seguinte: 5*60*1000- Simplesmente multiplico por 60segundos para facilitar a alteração. Eu posso mudar 5para 120se quiser 2 horas (120 minutos).
  3. new Date().getTime()-60*5*1000nos dá 1484383878676(5 minutos atrás em ms)

Agora precisamos alimentar isso em um new Date()construtor para obter o formato de string ISO exigido pelos registros de data e hora do MongoDB.

  1. { $gte: new Date(resultFromAbove).toISOString() } (consulta mongodb .find ())
  2. Como não podemos ter variáveis, fazemos tudo de uma só vez: new Date(new Date().getTime()-60*5*1000)
  3. ... então converta para string ISO: .toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString() nos dá 2017-01-14T08:53:17.586Z

Claro que isso é um pouco mais fácil com variáveis ​​se você estiver usando o driver node-mongodb-native, mas isso funciona no shell mongo, que é o que eu costumo usar para verificar as coisas.


1
Eu acho que você pode usar em Date.now()vez denew Date().getTime()
Béranger

4

Você também pode tentar:

{
    "dateProp": { $gt: new Date('06/15/2016').getTime() }
}

2

Se você estiver usando o Mongoose,

try {
  const data = await GPSDatas.aggregate([
    {
      $match: { createdAt : { $gt: new Date() }
    },
    {
      $sort: { createdAt: 1 }
    }
  ])
  console.log(data)

} catch(error) {
    console.log(error)
}

1

Encontre com uma data específica:

db.getCollection('CollectionName').find({"DepartureDate" : new ISODate("2019-06-21T00:00:00.000Z")})

Encontre com maior gteou menor lt:

db.getCollection('CollectionName').find({"DepartureDate" : { $gte : new ISODate("2019-06-11T00:00:00.000Z") }})

Localizar por faixa:

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.