Попытка включить Query в вызов MongoDB MapReduce - PullRequest
5 голосов
/ 05 апреля 2011

Я пытаюсь создать очень простой пример сокращения карты, который также включает запрос в вызов API MapReduce.

В моей коллекции много записей, отформатированных следующим образом:

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

Код выглядит следующим образом:

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

Все работает, если я не включаюqueryList в вызове MapReduce.Однако, если я включаю queryList, то получаю следующую ошибку времени выполнения:

Команда 'mapreduce' не выполнена: ошибка подтверждения db (ответ: {"утверждение": "'out" должно бытьстрока или объект "," assertionCode ": 13606," errmsg ":" Ошибка подтверждения db "," ok ": 0}) в MongoDB.Driver.MongoDatabase.RunCommandAs [TCommandResult] (команда IMongoCommand) в C: \ work \10gen \ mongodb \ mongo-csharp-driver \ Driver \ Core \ MongoDatabase.cs: строка 621 в MongoDB.Driver.MongoCollection.MapReduce (карта BsonJavaScript, уменьшение BsonJavaScript, параметры IMongoMapReduceOptions) в C: \ work \ 10gen \ mongobcsharp-driver \ Driver \ Core \ MongoCollection.cs: строка 788 в MongoDB.Driver.MongoCollection.MapReduce (запрос IMongoQuery, карта BsonJavaScript, сокращение BsonJavaScript) в C: \ work \ 10gen \ mongodb \ mongo-csharp-driver \ Driver \Core \ MongoCollection.cs: строка 823 в HPSLucene.Models.Mongo.MapReduce () в C: \ Inetpub \ wwwroot \ HPSLucene \ HPSLucene \ Models \ Mongo.cs: строка 158

Кто-нибудь знает, чтопроблемам есть?Большое спасибо.

Ответы [ 3 ]

7 голосов
/ 05 апреля 2011

Похоже, оно совпало с вашим вызовом по сравнению с той перегрузкой, которая, по вашему мнению, вы вызываете

т.е. вы намереваетесь вызвать перегрузку (запрос, отображение, уменьшение), но на самом деле она вызывает перегрузку (отображение, уменьшение, параметры). Это дает вам ошибку, поскольку ваш третий аргумент не является допустимым аргументом options.

Попробуйте использовать следующую перегрузку: (запрос, отображение, уменьшение, параметры) Тогда он будет работать так, как не запутается, какой использовать.

например. чтобы вернуть результаты M / R, встроенные, а не хранить в коллекции:

var mr = personCollection.MapReduce(queryList, map, reduce, 
                MapReduceOptions.SetOutput(MapReduceOutput.Inline));
3 голосов
/ 05 апреля 2011

Кстати, после ответа AdaTheDev вот что я закончил:

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 голосов
/ 05 апреля 2011

Я создал тестовую программу, чтобы воспроизвести это, и похоже, что она вызывает корректную перегрузку MapReduce. Но вы столкнулись с ошибкой в ​​драйвере. Для этого я создал чехол JIRA:

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

Ваша окончательная версия в порядке. Предоставляя явный параметр options, вы работаете над ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...