Java MongoDB';s减少阶段未按预期工作

Java MongoDB';s减少阶段未按预期工作,java,mongodb,mapreduce,Java,Mongodb,Mapreduce,我在MongoDB中学习了mapReduce编程的java教程,最后得到了以下代码: package mapReduceExample; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mongodb.MapReduceCommand; import com.mongodb.MapRe

我在MongoDB中学习了mapReduce编程的java教程,最后得到了以下代码:

package mapReduceExample;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MapReduceCommand;
import com.mongodb.MapReduceOutput;
import com.mongodb.Mongo;

public class MapReduceExampleMain {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Mongo mongo;

        try {
            mongo = new Mongo("localhost", 27017);
            DB db = mongo.getDB("library");

            DBCollection books = db.getCollection("books");

            BasicDBObject book = new BasicDBObject();
            book.put("name", "Understanding JAVA");
            book.put("pages", 100);
            books.insert(book);

            book = new BasicDBObject();
            book.put("name", "Understanding JSON");
            book.put("pages", 200);
            books.insert(book);

            book = new BasicDBObject();
            book.put("name", "Understanding XML");
            book.put("pages", 300);
            books.insert(book);

            book = new BasicDBObject();
            book.put("name", "Understanding Web Services");
            book.put("pages", 400);
            books.insert(book);

            book = new BasicDBObject();
            book.put("name", "Understanding Axis2");
            book.put("pages", 150);
            books.insert(book);

            String map = "function()"
                    + "{ "
                        + "var category; "
                        + "if ( this.pages > 100 ) category = 'Big Books'; "
                        + "else category = 'Small Books'; "
                        + "emit(category, {name: this.name});"
                    + "}";

            String reduce = "function(key, values)"
                    + "{"
                        + "return {books: values.length};"
                    + "} ";

            MapReduceCommand cmd = new MapReduceCommand(books, map, reduce,
                    null, MapReduceCommand.OutputType.INLINE, null);

            MapReduceOutput out = books.mapReduce(cmd);

            for (DBObject o : out.results()) {
                System.out.println(o.toString());
            }

            //aufräumen
            db.dropDatabase();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }
}
这是一个非常简单的reduce阶段,但它不是我想要的:(

输出为:

{ "_id" : "Big Books" , "value" : { "books" : 4.0}}
{ "_id" : "Small Books" , "value" : { "name" : "Understanding JAVA"}}
我希望:

{ "_id" : "Big Books" , "value" : { "books" : 4.0}}
{ "_id" : "Small Books" , "value" : { "books" : 1.0}}
对于一本小书,为什么reduce阶段不返回value.length


您好,Andre

因为如果只有一个结果,reduce将永远不会运行。请将其更改为最终功能或其他功能。

对mapReduce工作原理的基本了解
让我们介绍一下

  • 映射器-这是一个阶段,发射将数据馈送到reduce阶段。它需要发送一个键和一个值。如果你想在映射器中发射,你可以发射几次,但要求保持不变

  • reducer-当给定键的值超过一个时,调用reducer来处理该键发出的值列表


这就是说,由于映射器只发出one键值,因此没有调用减速机

您可以在中清除此项,但是来自映射器的发射的行为直接通过是标准设计