2014-06-30 36 views
6

Meteor'da bir proje için bir arama sistemi yapıyorum ve iki tarih arasında arama yapmak için bir alan koymam gerekiyor.Arama Tarih aralığı Meteor içinde

"relatorios" : [ 
    { 
     "mes" : ISODate("2013-11-01T02:00:00Z"), 
     "revistas" : "2", 
     "brochuras" : "2", 
     "livros" : "0", 
     "folhetos" : "0", 
     "revisitas" : "0", 
     "estudos" : "0", 
     "horas" : "12" 
    }, 
    { 
     "mes" : ISODate("2013-09-01T03:00:00Z"), 
     "revistas" : "0", 
     "brochuras" : "0", 
     "livros" : "0", 
     "folhetos" : "0", 
     "revisitas" : "0", 
     "estudos" : "0", 
     "horas" : "12" 
    } 
] 

Ben Mongo'da doğrudan filtreleme tarihleri ​​sorgulamak için çalıştık, ama yapamadı: Ancak, tarihler MongoDB sıranın içinde bulunmaktadır. Meteor'da MapReduce kullanımı hakkında bazı forumlarda okudum. En iyi seçenek nedir? Ve eğer mümkünse, nasıl yapabilirim?

+0

sorunuzu netleştirmek miyim? Ne sorduğundan emin değilim. – JohnnyHK

+0

Meteor tarafından bir alt belgede mongoda tarihler için bir sorgu yapmam gerekiyor. –

cevap

11

Sen Yani bu bu alanı eşleşmesi bir dizi olan tüm belgeleri alacağı a ve b

var start = new Date(450000); 
var end = new Date(5450000000000); 

CollectionName.find({ 'relatorios.mes' : { $gte : start, $lt: end }); 

arasında iki tarihlerde nokta notasyonu örneğin kullanabilirsiniz. Mongodb belgelerini eklediğini unutmayın, bu yüzden size uyan tek bir diziniz varsa, size tüm belgeyi verecektir.

+1

Bu şekilde yaptım, ama mongo dizinin tüm öğelerini döndürdü ve sadece tarihler değildi. Yalnızca sorguyla eşleşen öğeleri döndürmesinin bir yolu yok mu? Ya da Meteor'a yalnızca eşleşen öğelere nasıl ulaşırım? –

+0

Anladım! Tarihle eşleşmeyen öğeleri doğrudan Meteor'da kaldırıyorum. Teşekkür ederim! –

0

iki tarihleri ​​arasında bir mes değerine sahip tek bir dizi relatorios elemanı ve $ konumsal projeksiyon operatörü bulmak için $elemMatch kullanabilir, yalnızca, bu çıkış elemanı bulundu. kabuğunda

: Eğer $elemMatch kullanmazsanız

start = new Date('2013-11-01T01:30:00Z'); 
end = new Date('2013-11-01T02:30:00Z'); 
db.test.find(
    {relatorios: {$elemMatch: {mes: {$gt: start, $lt: end}}}}, 
    {'relatorios.$': 1}) 

o zaman bir eleman ve başka karşı $lt karşı $gt eşleşemiyordu.

Yoksa (yerine sadece ilk) Tarih aralığındaki tümrelatorios öğeleri almak için gerekiyorsa, aggregate kullanabilirsiniz:

db.test.aggregate([ 
    // Get all docs with at least one element in the date range 
    {$match: {relatorios: {$elemMatch: {mes: {$gt: start, $lt: end}}}}}, 
    // Duplicate each doc, once per relatorios element. 
    {$unwind: '$relatorios'}, 
    // Filter those to just the ones in the date range. 
    {$match: {'relatorios.mes': {$gt: start, $lt: end}}} 
]) 
+0

Bildiğim kadarıyla, Meteor toplamı desteklemiyor –

+0

@MuriloVenturoso Bunun için bir geçici çözüm var gibi görünüyor: http://stackoverflow.com/a/18884223/1259510 – JohnnyHK

+0

Geçtiğiniz kodu çalıştırıyorum, ancak Meteor döndürüyor aşağıdaki hata: Object [object Object] 'aggregate' yöntemine sahip değil –

0
let date = new Date(); 
    let getFirstDay = new Date(date.getFullYear(), date.getMonth() + 1, 1); 
    let getLastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0); 

    let firstDay = getFirstDay.getFullYear() + '-' + ((''+getFirstDay.getMonth()).length<2 ? '0' : '') + getFirstDay.getMonth() + '-' + ((''+getFirstDay.getDate()).length<2 ? '0' : '') + getFirstDay.getDate()+"T00:00:00.000Z"; 
    let lastDay = getLastDay.getFullYear() + '-' + ((''+getLastDay.getMonth()).length<2 ? '0' : '') + (getLastDay.getMonth()+1) + '-' + ((''+getLastDay.getDate()).length<2 ? '0' : '') + getLastDay.getDate()+"T00:00:00.000Z"; 

var pipeline = [ 
     { 
      $match: { headofficeId: headofficeId }}, 
      { $match: {'createdDate': {$gt: new Date(firstDay), $lt: new Date(lastDay)}}}, 
      {$group: {_id: "$branchId", total: {$sum: "$actualValue"}}}, 
      { $sort: { total: -1 } 
     } 
    ]; 
var result = Commissions.aggregate(pipeline); 
return result; 
+0

bu sizin kodunuzla eşleşmiyor.but bu sizin ihtiyacınıza göre kullanabileceğiniz bir ısırma kodu –

İlgili konular