Question

Je joue autour de stocker tweets à l'intérieur MongoDB, chaque objet ressemble à ceci:

{
"_id" : ObjectId("4c02c58de500fe1be1000005"),
"contributors" : null,
"text" : "Hello world",
"user" : {
    "following" : null,
    "followers_count" : 5,
    "utc_offset" : null,
    "location" : "",
    "profile_text_color" : "000000",
    "friends_count" : 11,
    "profile_link_color" : "0000ff",
    "verified" : false,
    "protected" : false,
    "url" : null,
    "contributors_enabled" : false,
    "created_at" : "Sun May 30 18:47:06 +0000 2010",
    "geo_enabled" : false,
    "profile_sidebar_border_color" : "87bc44",
    "statuses_count" : 13,
    "favourites_count" : 0,
    "description" : "",
    "notifications" : null,
    "profile_background_tile" : false,
    "lang" : "en",
    "id" : 149978111,
    "time_zone" : null,
    "profile_sidebar_fill_color" : "e0ff92"
},
"geo" : null,
"coordinates" : null,
"in_reply_to_user_id" : 149183152,
"place" : null,
"created_at" : "Sun May 30 20:07:35 +0000 2010",
"source" : "web",
"in_reply_to_status_id" : {
    "floatApprox" : 15061797850
},
"truncated" : false,
"favorited" : false,
"id" : {
    "floatApprox" : 15061838001
}

Comment pourrais-je écrire une requête qui vérifie les created_at et trouve tous les objets entre 18h47 et 19h00? Dois-je mettre à jour mes documents pour que les dates sont stockées dans un format spécifique?

Était-ce utile?

La solution

Interrogation pour une plage de dates (Mois de spécifique ou le jour) dans MongoDB livre de recettes a une très bonne explication sur la question, mais au-dessous est quelque chose que j'ai essayé moi-même et il semble fonctionner.

items.save({
    name: "example",
    created_at: ISODate("2010-04-30T00:00:00.000Z")
})
items.find({
    created_at: {
        $gte: ISODate("2010-04-29T00:00:00.000Z"),
        $lt: ISODate("2010-05-01T00:00:00.000Z")
    }
})
=> { "_id" : ObjectId("4c0791e2b9ec877893f3363b"), "name" : "example", "created_at" : "Sun May 30 2010 00:00:00 GMT+0300 (EEST)" }

Sur la base de mes expériences, vous aurez besoin de sérialisation vos dates dans un format qui supporte MongoDB, parce que les éléments suivants ont donné des résultats de recherche non désiré.

items.save({
    name: "example",
    created_at: "Sun May 30 18.49:00 +0000 2010"
})
items.find({
    created_at: {
        $gte:"Mon May 30 18:47:00 +0000 2015",
        $lt: "Sun May 30 20:40:36 +0000 2010"
    }
})
=> { "_id" : ObjectId("4c079123b9ec877893f33638"), "name" : "example", "created_at" : "Sun May 30 18.49:00 +0000 2010" }

Dans le second exemple aucun résultat n'a été prévu, mais il y avait encore un acquis. En effet, une comparaison de chaîne de base est fait.

Autres conseils

Pour clarifier. Ce qui est important à savoir est que:

  • Oui, vous devez passer un objet Date Javascript.
  • Oui, il doit être ISODate amical
  • Oui, de mon expérience obtenir que cela fonctionne, vous devez manipuler la date à la norme ISO
  • Oui, travailler avec des dates est généralement toujours un processus fastidieux, et mongo ne fait pas exception

Voici un extrait de travail de code, où nous faisons un peu de manipulation de jour pour assurer Mongo (ici je suis en utilisant le module mangouste et que vous souhaitez des résultats pour les lignes dont l'attribut la date est inférieure à (avant) la date indiquée comme myDate param ) peut gérer correctement:

var inputDate = new Date(myDate.toISOString());
MyModel.find({
    'date': { $lte: inputDate }
})

MongoDB stocke en fait les Millis d'une date comme int (64), tel que prescrit par http: // bsonspec. org / # / spécification

Cependant, il peut être assez déroutant lorsque vous récupérez les dates que le pilote du client instancier un objet date avec son propre fuseau horaire local. Le pilote JavaScript dans la console mongo va certainement le faire.

Donc, si vous vous souciez de vos fuseaux horaires, alors que vous savez faire ce qu'il est censé être quand vous récupérerez. Cela ne devrait pas d'importance tant pour les requêtes, car il sera toujours assimiler au même int (64), quel que soit le fuseau horaire de votre objet date est (je l'espère). Mais je serais certainement faire des requêtes avec des objets de la date réelle (pas de chaînes) et de laisser le conducteur faire son travail.

db.collection.find({"createdDate":{$gte:new ISODate("2017-04-14T23:59:59Z"),$lte:new ISODate("2017-04-15T23:59:59Z")}}).count();

Remplacer collection avec le nom de collection que vous voulez exécuter la requête

Moment.js et Comparaison de requêtes opérateurs

  var today = moment().startOf('day');
  // "2018-12-05T00:00:00.00
  var tomorrow = moment(today).endOf('day');
  // ("2018-12-05T23:59:59.999

  Example.find(
  {
    // find in today
    created: { '$gte': today, '$lte': tomorrow }
    // Or greater than 5 days
    // created: { $lt: moment().add(-5, 'days') },
  }), function (err, docs) { ... });

Convertir vos dates à fuseau horaire GMT que vous les farcir dans Mongo. De cette façon, il n'y a jamais un problème de fuseau horaire. Ensuite, il suffit de faire le calcul sur le champ twitter / fuseau horaire lorsque vous tirez les données en arrière pour la présentation.

Pourquoi ne pas convertir la chaîne à un nombre entier de la forme YYYYMMDDHHMMSS? Chaque incrément de temps serait alors de créer un plus grand nombre entier, et vous pouvez filtrer sur les entiers au lieu de se soucier de la conversion en temps ISO.

utilisation $ gte et $ lte pour trouver entre les données de date dans MongoDB

var tomorrowDate = moment(new Date()).add(1, 'days').format("YYYY-MM-DD");
db.collection.find({"plannedDeliveryDate":{ $gte: new Date(tomorrowDate +"T00:00:00.000Z"),$lte: new Date(tomorrowDate + "T23:59:59.999Z")}})

je l'ai essayé dans ce modèle selon mes besoins je dois stocker une date à laquelle jamais un objet est créé, je veux plus tard pour récupérer tous les enregistrements (documents) entre deux dates  dans mon fichier html j'utilisais le / jj / aaaa format suivant mm

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>

    <script>
//jquery
    $(document).ready(function(){  
    $("#select_date").click(function() { 
    $.ajax({
    type: "post",
    url: "xxx", 
    datatype: "html",
    data: $("#period").serialize(),  
    success: function(data){
    alert(data);
    } ,//success

    }); //event triggered

    });//ajax
    });//jquery  
    </script>

    <title></title>
</head>

<body>
    <form id="period" name='period'>
        from <input id="selecteddate" name="selecteddate1" type="text"> to 
        <input id="select_date" type="button" value="selected">
    </form>
</body>
</html>

dans mon fichier py (python) i il converti en "iso fomate" en suivant façon

date_str1   = request.POST["SelectedDate1"] 
SelectedDate1   = datetime.datetime.strptime(date_str1, '%m/%d/%Y').isoformat()

et enregistré dans ma collection de dbmongo avec "SelectedDate" comme champ dans ma collection

pour récupérer des données ou des documents entre deux dates à i utilisé après requête

db.collection.find( "SelectedDate": {'$gte': SelectedDate1,'$lt': SelectedDate2}})
mongoose.model('ModelName').aggregate([
    {
        $match: {
            userId: mongoose.Types.ObjectId(userId)
        }
    },
    {
        $project: {
            dataList: {
              $filter: {
                 input: "$dataList",
                 as: "item",
                 cond: { 
                    $and: [
                        {
                            $gte: [ "$$item.dateTime", new Date(`2017-01-01T00:00:00.000Z`) ]
                        },
                        {
                            $lte: [ "$$item.dateTime", new Date(`2019-12-01T00:00:00.000Z`) ]
                        },
                    ]
                 }
              }
           }
        }
     }
])
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top