Encontre objects entre duas datas MongoDB

Eu tenho brincado de armazenar tweets dentro do mongodb, cada object se parece com isso:

{ "_id" : ObjectId("4c02c58de500fe1be1000005"), "contributors" : null, "text" : "Hello world", "user" : { "following" : null, "followers_count" : 5, "utc_offset" : null, "location" : "", "profile_text_color" : "000000", "friends_count" : 11, "profile_link_color" : "0000ff", "verified" : false, "protected" : false, "url" : null, "contributors_enabled" : false, "created_at" : "Sun May 30 18:47:06 +0000 2010", "geo_enabled" : false, "profile_sidebar_border_color" : "87bc44", "statuses_count" : 13, "favourites_count" : 0, "description" : "", "notifications" : null, "profile_background_tile" : false, "lang" : "en", "id" : 149978111, "time_zone" : null, "profile_sidebar_fill_color" : "e0ff92" }, "geo" : null, "coordinates" : null, "in_reply_to_user_id" : 149183152, "place" : null, "created_at" : "Sun May 30 20:07:35 +0000 2010", "source" : "web", "in_reply_to_status_id" : { "floatApprox" : 15061797850 }, "truncated" : false, "favorited" : false, "id" : { "floatApprox" : 15061838001 } 

Como eu iria escrever uma consulta que verifica o created_at e encontra todos os objects entre 18:47 e 19:00? Preciso atualizar meus documentos para que as datas sejam armazenadas em um formato específico?

   

    Consultar um Intervalo de Datas (Mês ou Dia Específico) no Cookbook do MongoDB tem uma explicação muito boa sobre o assunto, mas abaixo está algo que eu experimentei e que parece funcionar.

     items.save({ name: "example", created_at: ISODate("2010-04-30T00:00:00.000Z") }) items.find({ created_at: { $gte: ISODate("2010-04-29T00:00:00.000Z"), $lt: ISODate("2010-05-01T00:00:00.000Z") } }) => { "_id" : ObjectId("4c0791e2b9ec877893f3363b"), "name" : "example", "created_at" : "Sun May 30 2010 00:00:00 GMT+0300 (EEST)" } 

    Com base em minhas experiências, você precisará serializar suas datas em um formato que o MongoDB suporte, porque o seguinte deu resultados de pesquisa indesejados.

     items.save({ name: "example", created_at: "Sun May 30 18.49:00 +0000 2010" }) items.find({ created_at: { $gte:"Mon May 30 18:47:00 +0000 2015", $lt: "Sun May 30 20:40:36 +0000 2010" } }) => { "_id" : ObjectId("4c079123b9ec877893f33638"), "name" : "example", "created_at" : "Sun May 30 18.49:00 +0000 2010" } 

    No segundo exemplo, nenhum resultado era esperado, mas ainda havia um obtido. Isso ocorre porque uma comparação básica de string é feita.

    Esclarecer. O que é importante saber é que:

    • Sim, você precisa passar um object JavaScript Date.
    • Sim, tem que ser amigável ao ISODate
    • Sim, pela minha experiência em fazer isso funcionar, você precisa manipular a data para ISO
    • Sim, trabalhar com datas geralmente é sempre um processo tedioso, e o mongo não é exceção

    Aqui está um trecho de código de trabalho, onde fazemos um pouco de manipulação de data para garantir Mongo (aqui estou usando o módulo mongoose e quero resultados para linhas cujo atributo de data é menor que (antes) a data dada como param myDate) corretamente:

     var inputDate = new Date(myDate.toISOString()); MyModel.find({ 'date': { $lte: inputDate } }) 

    MongoDB na verdade armazena o millis de uma data como um int (64), como prescrito por http://bsonspec.org/#/specification

    No entanto, pode ficar bastante confuso quando você recupera datas, pois o driver cliente irá instanciar um object de data com seu próprio fuso horário local. O driver JavaScript no console do mongo certamente fará isso.

    Então, se você se preocupa com seus fusos horários, certifique-se de saber o que deve ser quando voltar. Isso não deve importar tanto para as consultas, pois ele ainda será igual ao mesmo int (64), independentemente de em que fuso horário seu object de data está (espero). Mas eu definitivamente faria consultas com objects de data reais (não seqüências de caracteres) e deixaria o driver fazer sua coisa.

     db.collection.find({"createdDate":{$gte:new ISODate("2017-04-14T23:59:59Z"),$lte:new ISODate("2017-04-15T23:59:59Z")}}).count(); 

    Substituir collection pelo nome da coleção que você deseja executar consulta

    Python e pymongo

    Encontrando objects entre duas datas em Python com pymongo em posts coleção (baseado no tutorial ):

     from_date = datetime.datetime(2010, 12, 31, 12, 30, 30, 125000) to_date = datetime.datetime(2011, 12, 31, 12, 30, 30, 125000) for post in posts.find({"date": {"$gte": from_date, "$lt": to_date}}): print(post) 

    Onde {"$gte": from_date, "$lt": to_date} especifica o intervalo em termos de tipos datetime.datetime .

    Converta suas datas para o fuso horário GMT enquanto você as coloca no Mongo. Dessa forma, nunca há um problema de fuso horário. Em seguida, basta fazer as contas no campo twitter / timezone quando você puxar os dados de volta para apresentação.

    Por que não converter a string para um inteiro da forma YYYYMMDDHHMMSS? Cada incremento de tempo criaria um número inteiro maior e você pode filtrar os números inteiros, em vez de se preocupar com a conversão para o tempo ISO.

    Use este código para encontrar o registro entre duas datas usando $gte e $lt :

     db.CollectionName.find({"whenCreated": { '$gte': ISODate("2018-03-06T13:10:40.294Z"), '$lt': ISODate("2018-05-06T13:10:40.294Z") }}); 

    Eu tentei neste modelo como por meus requisitos eu preciso armazenar uma data sempre que um object é criado mais tarde eu quero recuperar todos os registros (documentos) entre duas datas no meu arquivo html eu estava usando o seguinte formato mm / dd / aaaa

     < !DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">       
    from to

    no meu arquivo py (python) eu converti-lo em “iso fomate” da seguinte maneira

     date_str1 = request.POST["SelectedDate1"] SelectedDate1 = datetime.datetime.strptime(date_str1, '%m/%d/%Y').isoformat() 

    e salvei na minha coleção dbmongo com “SelectedDate” como campo na minha coleção

    para recuperar dados ou documentos entre 2 datas eu usei a seguinte consulta

     db.collection.find( "SelectedDate": {'$gte': SelectedDate1,'$lt': SelectedDate2}}) 

    use $ get e $ lt para encontrar dados de data no mongodb

     var tomorrowDate = moment(new Date()).add(1, 'days').format("YYYY-MM-DD"); db.collection.find({"plannedDeliveryDate":{ $gte: new Date(tomorrowDate +"T00:00:00.000Z"),$lt: new Date(tomorrowDate + "T23:59:59.999Z")}})