J'utilise mongodb et je stocke datetime dans ma base de données de cette façon
pour une date "17-11-2011 18:00" je stocke:
date = datetime.datetime(2011, 11, 17, 18, 0)
db.mydatabase.mycollection.insert({"date" : date})
Je voudrais faire une demande comme ça
month = 11
db.mydatabase.mycollection.find({"date.month" : month})
ou
day = 17
db.mydatabase.mycollection.find({"date.day" : day})
quelqu'un sait comment faire cette requête?
Les dates sont stockées dans leur format d'horodatage. Si vous voulez tout ce qui appartient à un mois spécifique, recherchez le début et la fin du mois.
var start = new Date(2010, 11, 1);
var end = new Date(2010, 11, 30);
db.posts.find({created_on: {$gte: start, $lt: end}});
//taken from http://cookbook.mongodb.org/patterns/date_range/
Vous ne pouvez pas interroger directement les collections mongodb par des composants de date comme le jour ou le mois. Mais c'est possible en utilisant l'expression spéciale $ where javascript
db.mydatabase.mycollection.find({$where : function() { return this.date.getMonth() == 11} })
ou simplement
db.mydatabase.mycollection.find({$where : 'return this.date.getMonth() == 11'})
(Mais je préfère le premier)
Consultez les commandes Shell ci-dessous pour obtenir les parties de la date
>date = ISODate("2011-09-25T10:12:34Z")
> date.getYear()
111
> date.getMonth()
8
> date.getdate()
25
MODIFIER:
Utilisez $ où uniquement si vous n'avez pas d'autre choix. Il vient avec les problèmes de performances. Veuillez consulter les commentaires ci-dessous de @kamaradclimber et @dcrosta. Je vais laisser ce post ouvert pour que les autres personnes en aient connaissance.
et consultez le lien $ où Clauses et fonctions dans les requêtes pour plus d'informations
que diriez-vous de stocker le mois dans sa propre propriété puisque vous devez l'interroger? moins élégant que $where
, mais susceptible de mieux fonctionner car il peut être indexé.
Si vous souhaitez rechercher des documents appartenant à un mois spécifique, assurez-vous d'interroger comme ceci:
// Anything greater than this month and less than the next month
db.posts.find({created_on: {$gte: new Date(2015, 6, 1), $lt: new Date(2015, 7, 1)}});
Évitez autant que possible de demander comme ci-dessous.
// This may not find document with date as the last date of the month
db.posts.find({created_on: {$gte: new Date(2015, 6, 1), $lt: new Date(2015, 6, 30)}});
// don't do this too
db.posts.find({created_on: {$gte: new Date(2015, 6, 1), $lte: new Date(2015, 6, 30)}});
Vous pouvez exécuter une opération d'agrégation avec la fonction aggregate()
qui prend en $redact
pipeline qui utilise Opérateurs d'agrégation de dates dans l'expression de condition:
var month = 11;
db.collection.aggregate([
{
"$redact": {
"$cond": [
{ "$eq": [ { "$month": "$createdAt" }, month ] },
"$$KEEP",
"$$Prune"
]
}
}
])
Pour l'autre demande
var day = 17;
db.collection.aggregate([
{
"$redact": {
"$cond": [
{ "$eq": [ { "$dayOfMonth": "$createdAt" }, day ] },
"$$KEEP",
"$$Prune"
]
}
}
])
var month = 11,
day = 17;
db.collection.aggregate([
{
"$redact": {
"$cond": [
{
"$or": [
{ "$eq": [ { "$month": "$createdAt" }, month ] },
{ "$eq": [ { "$dayOfMonth": "$createdAt" }, day ] }
]
},
"$$KEEP",
"$$Prune"
]
}
}
])
var month = 11,
day = 17;
db.collection.aggregate([
{
"$redact": {
"$cond": [
{
"$and": [
{ "$eq": [ { "$month": "$createdAt" }, month ] },
{ "$eq": [ { "$dayOfMonth": "$createdAt" }, day ] }
]
},
"$$KEEP",
"$$Prune"
]
}
}
])
Le $redact
L'opérateur intègre les fonctionnalités de $project
et $match
pipeline et renverra tous les documents correspondant à la condition en utilisant $$KEEP
et jetez du pipeline ceux qui ne correspondent pas en utilisant le $$Prune
variable.
Vous pouvez trouver un enregistrement par mois, jour, année, etc. des dates par Opérateurs d'agrégation de dates , comme $ dayOfYear, $ dayOfWeek, $ mois, $ année etc.
Par exemple, si vous souhaitez que toutes les commandes créées en avril 2016, vous pouvez utiliser la requête ci-dessous.
db.getCollection('orders').aggregate(
[
{
$project:
{
doc: "$$ROOT",
year: { $year: "$created" },
month: { $month: "$created" },
day: { $dayOfMonth: "$created" }
}
},
{ $match : { "month" : 4, "year": 2016 } }
]
)
Ici est créé un champ de type date dans les documents, et $$ ROOT nous avons utilisé pour passer tous les autres champs à projeter dans l'étape suivante, et nous donner tous les détails des documents.
Vous pouvez optimiser la requête ci-dessus selon vos besoins, c'est juste pour donner un exemple. Pour en savoir plus sur les opérateurs d'agrégation de dates, visitez le lien .
Vous pouvez utiliser MongoDB_DataObject wrapper pour effectuer une telle requête comme ci-dessous:
$model = new MongoDB_DataObject('orders');
$model->whereAdd('MONTH(created) = 4 AND YEAR(created) = 2016');
$model->find();
while ($model->fetch()) {
var_dump($model);
}
OU, de même, en utilisant une chaîne de requête directe:
$model = new MongoDB_DataObject();
$model->query('SELECT * FROM orders WHERE MONTH(created) = 4 AND YEAR(created) = 2016');
while ($model->fetch()) {
var_dump($model);
}