2011-04-05 2 views
5

J'essaie de créer un exemple de mappage de carte très basique qui incorpore également une requête dans l'appel MAPI de MapReduce.Essayer d'inclure une requête dans MongoDB Appel de MapReduce

Ma collection a beaucoup d'entrées formatées comme suit:

{ "_id" : { "$binary" : "PdYV4WMTAEyYMQHXJZfzvA==", "$type" : "03" }, 
    "firstname" : "Matthew", 
    "surname" : "Chambers", 
    "email" : "" } 

Le code est le suivant:

var map = @" 
function() { 
    emit(this.surname, { count : 22 }); 
}"; 
var reduce = @" 
function(key, emitValues) { 
    return { count : emitValues[0].count }; 
}"; 

List<BsonValue> contactIds = new List<BsonValue>(); 
contactIds.Add(new Guid("A04FC88D-7BF7-443D-B5C3-EB11EE2B36DF")); 
contactIds.Add(new Guid("26B690B3-5ED7-47F4-A878-3906E28BBC58")); 
MongoDB.Driver.Builders.QueryConditionList queryList = MongoDB.Driver.Builders.Query.In("_id", BsonArray.Create(contactIds)); 
//var mr = personCollection.MapReduce(map, reduce);// THIS WORKS!  
var mr = personCollection.MapReduce(queryList, map, reduce); // THIS FAILS 

tout cela fonctionne si je ne comprends pas le queryList dans l'appel MapReduce. Cependant, si je fais inclure le queryList je reçois l'erreur d'exécution suivante:

Command 'mapreduce' failed: db assertion failure (response: { "assertion" : "'out' has to be a string or an object", "assertionCode" : 13606, "errmsg" : "db assertion failure", "ok" : 0 }) at MongoDB.Driver.MongoDatabase.RunCommandAs[TCommandResult](IMongoCommand command) in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Core\MongoDatabase.cs:line 621 at MongoDB.Driver.MongoCollection.MapReduce(BsonJavaScript map, BsonJavaScript reduce, IMongoMapReduceOptions options) in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Core\MongoCollection.cs:line 788 at MongoDB.Driver.MongoCollection.MapReduce(IMongoQuery query, BsonJavaScript map, BsonJavaScript reduce) in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Core\MongoCollection.cs:line 823 at HPSLucene.Models.Mongo.MapReduce() in C:\Inetpub\wwwroot\HPSLucene\HPSLucene\Models\Mongo.cs:line 158

Quelqu'un sait ce que le problème est? Merci beaucoup.

+1

Quelle version du pilote C# utilisez-vous? – AdaTheDev

+1

J'utilise 1.0.0.4098 – Journeyman

Répondre

7

On dirait qu'il a été trouvé votre appel à une surcharge différente de celle que vous pensez que vous appelez

-à-dire que vous avez l'intention d'appeler le (requête, carte, réduire) la surcharge mais en fait qu'il appelle la (carte , réduire, options) surcharge. Cela vous donne l'erreur car votre troisième argument n'est pas un argument d'options valide. Essayez l'utilisation de la surcharge suivante: (requête, carte, réduire, options) Il fonctionnera alors comme ne sera pas confondu quant à celui à utiliser.

par exemple. pour retourner les résultats de la ligne M/R, et non stocker dans une collection:

var mr = personCollection.MapReduce(queryList, map, reduce, 
       MapReduceOptions.SetOutput(MapReduceOutput.Inline)); 
+0

sous la version de pilote actuelle cette syntaxe ne semble pas être valide, à la place, il est nécessaire de définir un filtre via le paramètre 'options' comme indiqué dans la réponse @ Journeyman. –

3

BTW, après la réponse de AdaTheDev ce que je fini avec:

List<BsonValue> contactIds = new List<BsonValue>(); 
contactIds.Add(new Guid("A04FC88D-7BF7-443D-B5C3-EB11EE2B36DF")); 
contactIds.Add(new Guid("26B690B3-5ED7-47F4-A878-3906E28BBC58")); 
MongoDB.Driver.Builders.QueryConditionList queryList = MongoDB.Driver.Builders.Query.In("_id", BsonArray.Create(contactIds)); 
MongoDB.Driver.Builders.MapReduceOptionsBuilder builder=new MongoDB.Driver.Builders.MapReduceOptionsBuilder(); 
builder.SetOutput(MongoDB.Driver.Builders.MapReduceOutput.Inline); 
var mr = personCollection.MapReduce(map, reduce, builder); 
+0

Presque six ans plus tard, cet exemple de code était toujours utile! – Alan

+0

Bien qu'utile, cela ne semble pas indiquer l'utilisation de 'queryList' (affectée, mais non utilisée). –

0

J'ai créé un programme de test pour reproduire cela et il semble qu'il appelle en fait la surcharge correcte de MapReduce. Mais vous avez rencontré un bug dans le pilote. J'ai créé un cas JIRA pour elle:

http://jira.mongodb.org/browse/CSHARP-193

Votre version finale est très bien. En fournissant un paramètre d'options explicite, vous travaillez autour du bogue.

+0

Ceci a maintenant été corrigé sur la branche master et le correctif sera dans la prochaine version. Vous pouvez obtenir la source et construire le pilote vous-même si vous voulez le correctif plus tôt. Merci d'avoir signalé cela! –

+0

Sur la chance qu'il pourrait vous être utile de lire le programme de test que j'ai écrit, vous pouvez le voir ici: http://www.pastie.org/1759045 –

Questions connexes