2014-06-30 8 views
6

Sto facendo un sistema di ricerca per un progetto in Meteora e ho bisogno di mettere un campo per cercare tra due date. , Sono comunque le date all'interno della matrice in MongoDB:Cerca nell'intervallo di date in Meteor

"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" 
    } 
] 

ho cercato di interrogare date filtraggio direttamente mongo, ma non potevano. Ho letto su alcuni forum sull'utilizzo di MapReduce in Meteor. Qual è l'opzione migliore? E se possibile, come posso fare?

+0

Può chiarire la tua domanda? Non sono sicuro di cosa stai chiedendo. – JohnnyHK

+0

Ho bisogno di fare una query per le date in un documento secondario mongo di Meteor. –

risposta

11

È possibile utilizzare la notazione del punto per esempio per due date tra A e B

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

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

Quindi questo sarebbe ottenere tutti i documenti che hanno una matrice che corrisponde a questo campo. Ricorda che mongodb estrae i documenti, quindi se hai un solo array che corrisponde ti darà l'intero documento.

+1

L'ho fatto in questo modo, ma mongo ha restituito tutti gli elementi dell'array e non solo quali erano le date. Non c'è modo in cui restituisce solo gli elementi che corrispondono alla query? O come posso raggiungere la Meteora solo gli elementi che corrispondono? –

+0

Ho capito! Sto rimuovendo gli elementi che non corrispondono alla data in Meteor diretto. Grazie! –

0

È possibile utilizzare $elemMatch per trovare un singolo elemento dell'array relatorios che ha un valore mes tra due date, e l'operatore di proiezione $ posizionale per includere solo quel corrispondenza nell'output.

Nella shell:

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

Se non si utilizza $elemMatch allora potrebbe corrispondere $gt contro un elemento e $lt contro un altro.

Oppure, se avete bisogno di ottenere tuttirelatorios elementi della gamma Data (anziché solo il primo), è possibile utilizzare aggregate:

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

Da quello che so, Meteor non supporta l'aggregato –

+0

@MuriloVenturoso Sembra che ci siano soluzioni alternative per questo: http://stackoverflow.com/a/18884223/1259510 – JohnnyHK

+0

Sto eseguendo il codice che hai passato, ma il Meteor restituisce il errore seguente: Oggetto [oggetto oggetto] non ha alcun metodo 'aggregato' –

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

questo non è corrispondente al tuo codice. Ma questo è un codice di woking che puoi usare in base alle tue necessità –