Comment peut-convertit une chaîne de date avec mongo l'agrégation?
Dans une collection, je stocke ce type de document
{
"_id" : 1,
"created_at" : "2016/01/01 12:10:10",
...
}.
{
"_id" : 2,
"created_at" : "2016/01/04 12:10:10",
...
}
Je voudrais trouver des documents ont "creared_at" > 2016/01/01 en utilisant l'agrégation de pipeline.
Quelqu'un a la solution pour convertir les "created_at" à ce jour, donc peut conpare dans l'agrégation?
Il n'y a aucun moyen de convertir la chaîne de caractères à la date de l'agrégation de pipeline, tandis que la date de chaîne peut être. Vous pouvez astuce: créer une copie de votre collection et de stocker
Vous n'avez pas réellement besoin de convertir quoi que ce soit pour votre requête;
il fonctionne tellement bien, je n'ai pas le reconnaître. merci beaucoup
created_at
comme ISODate et puis comparer des dates...Vous n'avez pas réellement besoin de convertir quoi que ce soit pour votre requête;
{created_at: {$gt: '2016/01/01'}}
marcherait bien ici parce que votre chaîne de format prend en charge une comparaison significative.il fonctionne tellement bien, je n'ai pas le reconnaître. merci beaucoup
OriginalL'auteur user1697646 | 2016-01-17
Vous devez vous connecter pour publier un commentaire.
Comme vous l'avez mentionné, vous devez d'abord changer votre schéma de sorte que le
created_at
domaine détient date d'objets, par opposition à la chaîne, comme c'est le cas actuellement, alors vous pouvez interroger votre collection à l'aide de lafind()
de la méthode ou de l'agrégation cadre. L'ancien qui serait le plus simple d'approche.Pour convertir
created_at
champ date, vous devez effectuer une itération du curseur retourné par lafind()
méthode à l'aide de laforEach()
méthode, à l'intérieur de la boucle de convertir lecreated_at
champ d'un objet Date, et ensuite mettre à jour le champ à l'aide de la$
opérateur.Prendre avantage de l'utilisation de la En vrac en vrac, les mises à jour qui offre de meilleures performances que vous enverrez les opérations sur le serveur dans des lots de dire 1000, ce qui vous donne une meilleure performance que vous n'êtes pas l'envoi de chaque requête au serveur, il suffit d'une fois tous les 1000 demandes.
La suivante illustre cette approche, le premier exemple utilise la majeure partie de l'API disponible dans MongoDB versions
>= 2.6 and < 3.2
. Il met à jour tous lesles documents de la collection en modifiant les
created_at
champs pour les champs de date:L'exemple suivant s'applique à la nouvelle MongoDB version
3.2
qui a depuis obsolète la majeure partie de l'API et a fourni un nouveau jeu d'api à l'aide debulkWrite()
:Une fois que le schéma de la modification est terminée, vous pouvez interroger votre collection pour la date:
Et si vous souhaitez requête à l'aide de l'agrégation cadre, exécutez la commande suivante pipeline pour obtenir le résultat souhaité. Il utilise le
$match
opérateur, qui est similaire à lafind()
méthode:OriginalL'auteur chridam
Toutes les réponses ci-dessus, l'utilisation
cursors
mais cependant, mongodb recommandons de toujours utiliseraggregation
pipeline. Avec la nouvelle$dateFromString
dansmongodb 3.6
, son très simple.https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromString/
OriginalL'auteur N Raghu
Si l'on dispose de documents:
Requête Simple:
Requête d'agrégation:
Plus d'informations sur le type de date ici et ici
OriginalL'auteur alex10