1
votes

Node.js / MongoDB - interrogation des dates

J'ai un peu de mal à comprendre comment interroger les dates; Je pense que le problème pourrait être lié à la manière dont mes données sont structurées. Voici un exemple de document sur ma base de données.

  .find({"rooms": { "reservations": {   "checkIn" : {"$gte": { "$date": "2019-01-09T00:00:00.000Z"}}}}})

J'essaie d'interroger les dates pour voir si une salle spécifique est disponible à une certaine plage de dates, mais quoi que je fasse je Je n'arrive pas à obtenir un résultat correct, que ce soit ma requête 404 ou retourne un tableau vide.

J'ai vraiment tout essayé, pour plus de simplicité, j'essaie juste de faire fonctionner la requête avec checkIn, donc je peut comprendre ce que je fais mal. J'ai essayé 100 variantes du code ci-dessous mais je n'ai pas du tout réussi à le faire fonctionner.

{

    "phone_num": 12553,
    "facilities": [
        "flat-screen",
        "parking"
    ],
    "surroundings": [
        "ping-pong",
        "pool"
    ],
    "rooms": [
        {
            "room_name": "Standard Suite",
            "capacity": 2,
            "bed_num": 1,
            "price": 50,
            "floor": 1,
            "reservations": [
                {
                    "checkIn": {
                        "$date": "2019-01-10T23:23:50.000Z"
                    },
                    "checkOut": {
                        "$date": "2019-01-20T23:23:50.000Z"
                    }
                }
            ]
        }
    ]
}

Suis-je mal compris comment la méthode .find fonctionne ou est-ce que quelque chose ne va pas avec la façon dont Je garde mes dates? (Je continue de voir des gens mentionner les ISODates mais je ne sais pas trop de quoi il s'agit ou comment mettre en œuvre).

Merci d'avance.


0 commentaires

3 Réponses :


3
votes

Je pense que la requête que vous avez publiée n'est pas correcte. Par exemple, si vous souhaitez rechercher les salles avec les heures d'enregistrement dans une certaine plage, la requête doit être comme ceci -

.find({"rooms.reservations.checkout":{$gte:new Date("2019-01-06T13:11:50+06:00"), $lt:new Date("2019-01-06T14:12:50+06:00")}})

Vous pouvez maintenant faire de même avec l'heure de départ pour obtenir le filtrage approprié pour trouver les chambres disponibles dans une plage de dates.

Un conseil cependant, la façon dont vous avez conçu votre collection n'est pas durable à long terme. Par exemple, la requête de date que vous essayez d'exécuter vous donnera les bons documents, mais pas les salles à l'intérieur de chaque document qui correspondent à votre plage de dates. Vous devrez le faire vous-même côté serveur (en supposant que vous n'utilisez pas l'agrégation). Cela empêchera votre serveur de traiter d'autres demandes en attente, ce qui n'est pas souhaitable. Je vous suggère de diviser la collection et de placer les salles et les réservations dans des collections distinctes pour faciliter les requêtes.


4 commentaires

Merci qui a fonctionné! Question rapide, les `` réservations '' contiennent la plage de dates où une chambre est réservée, j'essaie de réaliser une requête où l'utilisateur saisira la date d'arrivée et la date de départ et il renverra toutes les chambres disponibles pendant cette plage de dates . Comment me proposez-vous de procéder? Ma requête doit-elle rechercher des chambres qui ont été RÉSERVÉES pendant cette plage de dates, puis les supprimer de la liste totale des chambres? Sinon, à quoi ressemblerait une requête qui atteint ce qui précède? Merci encore mec!


Vous devez utiliser l'agrégation dans ce cas. Utilisez "$ unwind" sur les sous-documents sur les chambres et les réservations, puis utilisez un simple "$ match" pour trouver les salles qui remplissent les conditions. Voici la documentation pour l'agrégation - docs.mongodb.com/manual/aggregation


Je sais que c'est peut-être une question stupide, mais je suis nouveau sur mongoDB et nodeJS, je ne peux pas utiliser la fonction d'agrégation sur mon modèle d'hôtel 'var Hot = mongoose.model (' Hotel ');' Tous les exemples que je vois utilisent db.collection.aggregate; comment dois-je procéder lorsque j'utilise le Hot var pour interroger? Désolé, je suis un débutant total


Dans votre cas, il devrait Hot.aggregation ([]). Le tableau à l'intérieur doit ressembler au pipeline d'agrégation mongodb.



0
votes

var mydate1 = new Date ();

var mydate1 = new Date (). getTime ();

ObjectId.getTimestamp ()

Returns the timestamp portion of the ObjectId() as a Date.

Exemple

L'exemple suivant appelle la méthode getTimestamp () sur un ObjectId ():

ObjectId ("507c7f79bcf86cd7994f6c0e"). getTimestamp ()

Cela renverra la sortie suivante:

ISODate ("2012-10-15T21: 26: 17Z")


0 commentaires

1
votes

Récemment, je travaillais sur une requête de date. Tout d'abord, nous devons comprendre comment nous stockons la date dans la base de données mongodb. Disons que j'ai stocké des données en utilisant le format d'heure UTC comme 2020-07-21T09: 45: 06.567Z.

et ma structure json est

 let result = await Rental.find({
    dateOut: {
        $lt:''+new Date('2020-07-22').toISOString(),
        $gt:''+new Date('2020-07-21').toISOString()
    }
})

et je veux effectuer un requête afin que je puisse obtenir toutes les données uniquement pour cette date (21/07/2020). Alors, comment pouvons-nous effectuer cela ?. Nous devons maintenant comprendre les bases.

[
{
    "dateOut": "2020-07-21T09:45:06.567Z",
    "_id": "5f1416378210c50bddd093b9",
    "customer": {
        "isGold": true,
        "_id": "5f0c1e0d1688c60b95360565",
        "name": "pavel_1",
        "phone": 123456789
    },
    "movie": {
        "_id": "5f0e15412065a90fac22309a",
        "title": "hello world",
        "dailyRentalRate": 20
    }
}
]

Nous devons trouver les données de 21 dates afin que notre requête soit supérieure à 21 et inférieure à 22 cause 2020-07-21T00: 45 : 06.567Z, 2020-07-21T01: 45: 06.567Z .. ... .. ce temps est supérieur à 21 mais inférieur à 22.


0 commentaires