Bonjour,

j'essaye de faire un mapReduce pour obtenir uniquement une entrée d'un sous-document (un commentaire d'un post) et bizarrement ça marche sans "reduce". Malgré des heures de recherche et de fouinage dans les docs et exemples en anglais, je ne comprends pas la logique.

Quoi que je fasse dans la fonction "reduce", il ne se passe rien du tout.

Un document :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
user_id: MongoId,
title: 'blabla',
article: 'mon article',
comments: {
"0": {
entry_id: 'test',
text: 'texte du commentaire'
},
 
"1": { ... }
}
Le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Map
$map = new MongoCode('function() 
{
	for (var com in this.comments) {
		if(this.comments[com].entry_id == entry_id)
			emit(this.user_id, {comment:this.comments[com],entry_id:entry_id});
	}
 
}', array('entry_id' => 'test'));
 
// réduce (qui ne sert à rien mais si je le retire la requête ne passe pas (génère une Mongo exception)
$reduce = new MongoCode('function(key,val)
{
return "plop";
}');
 
// La commande
$command = array(
	'mapreduce' => 'posts',
	'map' => $map,
	'reduce' => $reduce,
	'query' => array('_id' => $T->doc->_id),
	'out' => array('inline' => 1),
	'verbose' => true // debug infos
);
$result = $Blog->db->command($command);
 
var_dump($result);
Résultat du var_dump() :
array
'results' =>
array
0 =>
array
'_id' =>
object(MongoId)[30]
...
'value' =>
array
...
'timeMillis' => int 22
'timing' =>
array
'mapTime' => float 0
'emitLoop' => int 22
'reduceTime' => float 0
'mode' => string 'mixed' (length=5)
'total' => int 22
'counts' =>
array
'input' => int 1
'emit' => int 1
'reduce' => int 0
'output' => int 1
'ok' => float 1
Quelqu'un pourrait m'éclairer svp ?