2015-07-07 9 views
6

Come faccio a richiedere un campo data in MongoDB con solo la data e non le ore? Ad esempio, se MongoDB memorizza il 7 luglio 2015 con qualsiasi ora, voglio abbinare quel giorno solo alla data odierna.MongoDB che confronta le date solo senza orari

In MySQL, vorrei fare SELECT col1, col2 FROM table WHERE DATE(date_field) = DATE(NOW());

Si noti come MySQL ha una funzione per cambiare il date_field alla data solo durante la corrispondenza. Posso farlo in MongoDB con una funzione simile durante l'abbinamento? Come Collection.find({ dateonly(datetimefield): dateonly(new Date() }); o qualcosa del genere?

Capisco la data/ora dei negozi Mongo in GMT, quindi dovrei anche convertire la data e l'ora GMT memorizzata da GMT a Locale prima di abbinare solo la data, ma per farmi iniziare, vorrei sapere se posso elimina il tempo di un incontro di date. Ad esempio, se GMT ora è l'8 luglio alle 03:00, mentre il fuso orario locale è il 7 luglio alle 23:00, allora vorrei corrispondere al 7 luglio.

+0

Che cosa è il formato della data nel vostro MongoDB? –

+1

Il formato del campo della data è uguale all'oggetto della data di Javascript. Come: 'new Date()'. –

+1

Pensando a questo ora ... forse la soluzione migliore è quella di memorizzare un altro campo che è in formato numerico che rappresenta la data locale? Come 20150706 per YYYYMMDD? Quindi fai solo confronti numerici? –

risposta

1

Così suona come non c'è MongoDB equivalente alla funzione di MySQL DATE, come con SELECT col1, col2 FROM table WHERE DATE(date_field) = DATE(NOW())

Al posto di una soluzione nativa, ho risolto questo con l'uso MomentJS fuso orario (http://momentjs.com/timezone/) per convertire la data/ora per un campo numerico solo per data, quindi memorizzo la data come un numero.

Nel mio codice javascript (al di fuori di MongoDB):

var localDate = function(timezone, d) { 
    if (d == undefined) { d = new Date(); } // current date/time 
    return Number(moment(d).tz(timezone).format("YYYYMMDD")); 
} 

Poi ho memorizzare un campo data solo nel record Mongo.

var myDate = localDate("America/New_York"); // today, in YYYYMMDD number 
db.birthdays.insert(
    { dateonly: myDate, event: "This day is my birthday!" } 
); 

Poi nel mio codice Javascript, mi può facilmente interrogare oggi, domani, 2 giorni da oggi, ecc

// today 
var myDate = localDate("America/New_York"); 
db.birthdays.find({ dateonly: myDate }); 

// tomorrow 
var myDate = localDate("America/New_York", new Date(new Date().setDate(new Date().getDate() + 1))); 
db.birthdays.find({ dateonly: myDate }); 

// someone in Paris wants to know birthdays on the calendar in 7 days 
var myDate = localDate("Europe/Paris", new Date(new Date().setDate(new Date().getDate() + 7))); 
db.birthdays.find({ dateonly: myDate }); 

Spero che questo aiuti qualcuno.

2

Immagino che dovresti fare una query di intervallo tra l'inizio di il giorno e il suo finale (o senza fine se stai parlando di oggi). Qualcosa di simile

db.collection.find({ 
    "date" : {"$gte": new Date("2015-07-07T00:00:00.000Z"), 
      "$lt": new Date("2015-07-08T00:00:00.000Z")} 
}) 
0

Ho eseguito una combinazione delle risposte di Crash_Override e Maxim_PontyUshenko. Usa Moment.js e gli operatori di mongo $ gt, $ lt.

ship_date: { 
    $lt: moment().hours(0).minutes(0).seconds(0).milliseconds(0).add(28, "days").toDate(), 
    $gte: moment().hours(0).minutes(0).seconds(0).milliseconds(0).toDate() 
} 
1

Questa è la mia soluzione proposta:

db.collection.find({ 
    $and: [ 
    {"date": {$gte: new Date("2015-07-07T00:00:00.000Z")}}, 
    {"date": {$lt: new Date("2015-07-08T00:00:00.000Z")}} 
    ] 
}) 
+0

I campi di data/ora convenzionali si complicano quando si fa riferimento a giorni di calendario speciali come un anniversario o un compleanno. Per rendere il codice semplice, ora memorizzo un campo "numero" nel formato di AAAAMMGG. Facile convertire il numero in stringa, quindi verificare se le ultime 4 cifre (la parte MMDD) corrispondono al mese e al giorno dell'utente corrente. Se è così, auguro loro un buon compleanno. Se questo è stato fatto con un campo di data convenzionale, dovrei fare conversioni del fuso orario per determinare se si trovano in un fuso orario in cui il loro compleanno è il giorno corrente. –

Problemi correlati