2014-07-07 6 views
0

En PHP & MongoDB, j'essaie de lire toutes les instances d'événements pour un calendrier spécifique et une période spécifique. Chaque événement a ses dates de début et de fin. Ils sont de type MongoDate en mongodb.mysql BETWEEN équivalent dans MongoDB

J'utilise la condition ci-dessous pour obtenir les événements de Mongo.

$condition = array(
'start_time' => array('$gte' => new MongoDate($start_day)), 
'end_time'  => array('$lte' => new MongoDate($end_day)) 
); 

Voici mon problème, il me manque les événements dont la date de début est à ma plage de dates.

Par exemple événement commence le 01-juillet-2014
événement se termine le 10 juillet 2014

ma requête mongo - me donner des événements de 5 juillet au 12 juillet

$condition = array(
    'start_time' => array('$gte' => '5-july-2014'), 
    'end_time'  => array('$lte' => '12-july-2014') 
); 

Lorsque j'exécute l'événement mentionné ci-dessus n'est pas retourné.

Toutes les suggestions sont les bienvenues?

Dans mysql BETWEEN m'aide à obtenir les résultats requis.

+0

Quel événement n'est pas retourné? Montre aussi la requête mysql "working". –

+0

l'événement dont j'ai parlé qui commence le 01-juillet-2014. J'utilise 3 à 4 ou des conditions avec des dates de fin de début avec entre dans mysql. – codepiper

+0

Je devrais supprimer l'équivalent de mysql et juste chercher la solution spécifique de mongo. – codepiper

Répondre

3

Votre requête sélectionne tous les événements qui sont complètement contenus dans la période donnée, mais quand je vous ai bien compris, vous souhaitez que les événements qui se chevauchent partiellement ou complètement la date de gamme.

Une date de gamme chevauche une autre date de gamme lorsque le début de A est avant la fin de B et la fin de A est après le début de B. Donc, essayez

'event_start' => array('$lte' => new MongoDate($search_end)), 
'event_end'  => array('$gte' => new MongoDate($search_start)) 

Un autre écueil que je devrais mentionner est qu'un MongoDate ne représente pas un seul jour, mais un moment précis dans le temps. Lorsque vous omettez l'heure, vous obtenez minuit à cette date. Donc '$lte' => '12-july-2014' vous donne 2014-04-12 0:00:00.000 qui ne sélectionnera rien sur le 12 juillet. Lorsque vous souhaitez inclure ce jour, définissez manuellement une heure comme 12-july-2014 23:59:59 ou utilisez le jour suivant.

+0

cela n'aide pas si ma date de fin de l'événement est le 20 juillet 2014 – codepiper

+0

@codepiper It should. Le 20 juillet 2014 est supérieur au 5 juillet 2014. Ou ai-je mal compris votre question? – Philipp

+0

@ vérifié à nouveau à cette logique, cela a bien fonctionné. Merci. – codepiper

1

Aucun équivalent direct "entre", mais avec des données comme celui-ci:

{ 
    "start_time" : ISODate("2014-07-01T00:00:00Z"), 
    "end_time" : ISODate("2014-07-10T00:00:00Z") 
} 
{ 
    "start_time" : ISODate("2014-07-05T00:00:00Z"), 
    "end_time" : ISODate("2014-07-12T00:00:00Z") 
} 
{ 
    "start_time" : ISODate("2014-07-07T00:00:00Z"), 
    "end_time" : ISODate("2014-07-14T00:00:00Z") 
} 
{ 
    "start_time" : ISODate("2014-07-13T00:00:00Z"), 
    "end_time" : ISODate("2014-07-14T00:00:00Z") 
} 

Cela fonctionne:

db.collection.find(
    { 
     "$or": [ 
      { "start_time": { 
       "$gte": new Date("2014-07-05"), 
       "$lte": new Date("2014-07-12") 
       } 
      }, 
      { "end_time": { 
       "$gte": new Date("2014-07-05"), 
       "$lte": new Date("2014-07-12") 
       } 
      } 
     ] 
    } 
) 

Et produit:

{ 
    "start_time" : ISODate("2014-07-01T00:00:00Z"), 
    "end_time" : ISODate("2014-07-10T00:00:00Z") 
} 
{ 
    "start_time" : ISODate("2014-07-05T00:00:00Z"), 
    "end_time" : ISODate("2014-07-12T00:00:00Z") 
} 
{ 
    "start_time" : ISODate("2014-07-07T00:00:00Z"), 
    "end_time" : ISODate("2014-07-14T00:00:00Z") 
} 

qui est juste les éléments qui auraient des dates comprises entre "début" et "fin".

+0

A travaillé parfaitement, merci . – codepiper

Questions connexes