2016-11-26 1 views
0

Je construis un système de "filtrage" et j'ai besoin de demander aux utilisateurs de la collection dont la date de naissance est entre 2 dates.Demander une date dans MongoDB quand il est stocké en texte brut et format YYYY-MM-DD

Le code que j'ai droit ressemble maintenant:

if (req.query.ageMin) { 
    var dobMin = new Date(dateNow.setFullYear(dateNow.getFullYear() - req.query.ageMin)); 
} 
if (req.query.ageMax) { 
    var dobMax = dateNow.setFullYear(dateNow.getFullYear() - req.query.ageMax); 
} 

if (dobMin && dobMax) { 
    query.dob = { 
    $gte: dobMin, 
    $lt: dobMax 
    } 
} else if (dobMin) { 
    query.dob = { 
    $gte: dobMin 
    } 
} else if (dobMax) { 
    query.dob = { 
    $lt: dobMax 
    } 
} 

db.users.find(query).toArray(function (err, users) { 
    console.log(users); 
}); 

Un tableau vide est retourné (pas d'erreur). Je suppose que c'est parce que la date dans la collection n'est pas un objet date - ce sont simplement des chaînes par exemple "1980-06-15". Y at-il une option que je peux passer à la requête afin que Mongo fasse de la date stockée un objet date lors de l'interrogation? Ou toute solution pour cette question ...

+0

Si * dateNow * est une date JS plaine, quand vous faites 'dateNow.setFullYear (...)' vous modifier la valeur de * dateNow *. Donc, si vous cherchez quelqu'un entre 18 et 20 ans en 2016, alors * dobMin * sera 1998 et * dobMax * sera 1978. En outre, * setFullYear * renvoie une valeur de temps, pas une date, donc * dobMax * est un nombre alors que * dobMin * est une date. Bien que les comparaisons utilisant des opérateurs de comparaison fonctionneront toujours car elles forceront les dates à numéroter. – RobG

+0

Bonne capture, effectivement attrapé cela et ajouté la nouvelle fonction Date() sur dobMax ainsi. Merci pour l'info. –

Répondre

1

Essayez de convertir les instances de date à cordes:

dobMin = dobMin.toISOString().substring(0, 10) 
dobMax = dobMax.toISOString().substring(0, 10) 
+0

Merci, je l'ai résolu de manière similaire en faisant 'dobMax = dobMax.toISOString(). Split ('T') [0];' –

+1

Notez que 'new Date (dateNow.setFullYear (dateNow.getFullYear() - req.query .ageMin)) 'utilisera le décalage horaire de l'hôte, mais * toISOString * utilise UTC. Pas de problème si le fuseau horaire de l'hôte est +00: 00 ou plus, mais pour les fuseaux horaires -00: 15 ou plus (par exemple, toute l'Amérique du Nord et du Sud), la date sera la veille. – RobG