2010-09-22 16 views
0

Je semble avoir des problèmes avec le curseur lorsque j'essaie de sortir des données d'un MongoDB. Voici une capture d'écran de ma structure de données simple:Impossible d'accéder aux valeurs dans MongoDB avec le curseur en utilisant PHP

data structure screenshot http://droplr.com/IpcH+

Je suis en train d'utiliser les éléments suivants:

$collection_name = "users"; 
$collection = $this->mongo->db->$collection_name; 
$which_document = array("email" => $email_address); 
$which_fields = array("words"); 
$cursor = $collection->find($which_document, $which_fields); 

Mais mon curseur $ ne semble pas aller plus loin dans le document que le document réel. À la fin, je cherche tri() et limite() sur le champ created_at dans le champ «words», mais je semble être dans une impasse ici. Et le passage d'erreur de MongoDB n'est pas très utile, ou je ne sais pas comment l'utiliser correctement. (Je suppose que le dernier.)

Une idée: Je ne suis pas sûr que la table "mots" générée entre crochets est correcte, mais voici le code que j'utilise pour insérer des données ici:

function create_word($word, $email_address){ 
    $collection = 'users'; 

// make sure word isn't null 
if($word !== NULL){ 

// add new data to the 'words' set 
    $new_data = array('$addToSet' => array('words' => array(
                  'word' => $word, 
                  'status' => 'open', 
                  'created_at' => time() 
                  ))); 
    $this->mongo->db->$collection->update(array('email' => $email_address), $new_data);   
} 

Merci beaucoup pour toute aide que vous pouvez donner!

Répondre

2

Vous ne pouvez pas trier les sous-documents. Vous devez le faire du côté client. Dans votre cas, récupérez les mots array:

$array = iterator_to_array($cursor); 
$words = $array[0]["words"]; 

puis d'utiliser php pour trier les valeurs.

+0

Ah, la notation dot! Existe-t-il une règle stricte sur quand on devrait utiliser la notation par points dans le pilote php? Malheureusement, pas de chance. Voici une [capture d'écran] (http://droplr.com/hHjj) d'un var_dump de la valeur du curseur en utilisant [ce code] (http://droplr.com/QUJW). Est-ce que j'ai raté quelque chose de vos mises à jour? Je vais vraiment trier sur created_at, mais j'ai essayé d'alterner entre "1" et "-1", sans différences. –

+0

J'étais curieux et j'ai essayé moi-même maintenant. Le tri des sous-documents ne fonctionne pas. L'exemple de la documentation couvre un type différent de tri où vous avez imbriqué des valeurs dans un document et trier tous les documents après eux et non un tableau imbriqué. – halfdan

+0

Intéressant. C'est mon premier projet avec MongoDB, de votre point de vue, suggérez-vous une sorte de restructuration des données? Cela semble être un problème assez important, car je vais essentiellement paginer ces données, il serait très agréable d'utiliser .limit(), .skip() et .sort(). –

1

Essayez

$collection->find(array($which_document, $which_fields))->sort(array("words.created_at" => -1)); 
+0

Malheureusement, je n'ai pas de chance ici. Que j'utilise 1 ou -1, mon var_dump reste le même. –

+0

Clarifions-nous? Vous essayez de trier le tableau "words" par le "created_at?" Je ne suis pas sûr si vous pouvez le faire. J'ai soulevé ce problème avec les développeurs. Voir la discussion suivante que j'ai soulevée sur le forum de mongodb http://groups.google.com/group/mongodb-user/browse_thread/thread/4b950895dc0fab9c/60bb74a316a7eaba?lnk=gst&q=sdotsen#60bb74a316a7eaba – luckytaxi

+0

Des sons comme vous et halfdan pointent vers le même problème. En lisant le fil maintenant, mais je poserai la même question ici que je l'ai avec lui. Suggéreriez-vous une restructuration des données puisque je vais travailler de manière si intensive avec ces données? –