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.