2015-07-07 37 views
6

MongoDB'deki bir tarih alanını, yalnızca tarihle değil, yalnızca bir tarihle nasıl sorgularım? Örneğin, MongoDB 7 Temmuz 2015 tarihini ile saatinde depolarsa, o güne sadece bugünün tarihiyle uymak istiyorum.MongoDB yalnızca tarihleri ​​olmadan tarihleri ​​karşılaştırıyor

MySQL, ben MySQL yalnızca eşleşen sırasında bugüne kadar DATE_FIELD değiştirmek için bir işlevi vardır nasıl SELECT col1, col2 FROM table WHERE DATE(date_field) = DATE(NOW());

Bildirimi yapardı. Bunu eşleştirme sırasında benzer bir işlevle MongoDB'de yapabilir miyim? Collection.find({ dateonly(datetimefield): dateonly(new Date() }); veya benzeri bir şey gibi mi?

GMT'de Mongo mağazalarının tarihlerini/saatlerini anlıyorum. Bu nedenle, GMT'den GMT'ye yerel saati yalnızca tarihe göre eşleştirmeden önce dönüştürmek zorunda kaldım, ancak başlamam için şunu yapabilirim. Bir tarih eşleşmesinin zamanını keser. Örneğin, GMT şu anda 8 Temmuz saat 03:00, ancak Yerel Doğu Saati ABD saat 23: 00'de 7 Temmuz'da eşleşiyorsa, o zaman 7 Temmuz ile eşleşmek isterim.

+0

nedir senin mongodb içinde tarih formatı? –

+1

Tarih alanı biçimi, Javascript tarih nesnesiyle aynıdır. Gibi: 'yeni Tarih()'. –

+1

Şimdi bunu düşünün ... belki de en iyi çözüm, yerel tarihi temsil eden sayısal formatta başka bir alanı depolamaktır? YYYYMMDD için 20150706 gibi mi? O zaman sadece sayısal karşılaştırmalar yapın? –

cevap

1

gibi bir şey Yani bu sesler, ben dönüştürmek için kullanımı MomentJS Timezone (http://momentjs.com/timezone/) tarafından bu çözüldü bir tarih-sadece sayısal alana tarih/saat, sonra tarih numarasını bir sayı olarak saklıyorum. Benim javascript kodu

(MongoDB dışında):

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

Sonra Mongo kaydında bir tarih-okunur bir alan saklayın.

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

Sonra benim JavaScript kodunda, kolayca bu kimse yardımcı olur bugün, vb yarın Bundan 2 gün,

// 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 }); 

Umut sorgulayabilir.

2

Sanırım başlangıç ​​arasında bir aralık sorgulaması yapmalısınız. gün ve onun bitişi (ya da bugün bahsettiğinizde bitmeden). Yerel bir çözümün Ziyade SELECT col1, col2 FROM table WHERE DATE(date_field) = DATE(NOW())

olduğu gibi, MySQL'in DATE işlevine hiçbir mongodb eşdeğer olduğu gibi bu

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

Crash_Override ve Maxim_PontyUshenko'nun yanıtlarının bir birleşimini yaptım. Moment.js'yi ve $ gt, $ lt mongo operatörlerini kullanın.

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

Bu benim önerdiği çözüm:

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

Geleneksel Tarih/Saat alanları, yıldönümü veya doğum günü gibi özel takvim günlerine başvururken karmaşıklaşır. Kodu kolaylaştırmak için şimdi YYYYMMDD formatında bir "sayı" alanı saklıyorum. Bu sayıyı dizgiye dönüştürmek kolaydır, ardından son 4 hanenin (MMDD kısmı) geçerli kullanıcının ay ve günüyle eşleşip eşleşmediğine bakın. Eğer öyleyse, onlara mutlu yıllar diliyorum. Bu geleneksel bir tarih alanıyla yapılmışsa, doğum günlerinin geçerli olduğu bir saat diliminde bulunup bulunmadığını belirlemek için saat dilimi dönüşümlerini yapmak zorundayım. –

İlgili konular