2012-04-05 36 views
5

Có cách nào để Thực thi bản đồ MongoDB giảm bớt công việc thông qua trình điều khiển java mà bạn tạo một phạm vi DBObject chứa các hàm.Trong MongoDB java driver Mapreduce phạm vi lệnh; Thêm chức năng vào Phạm vi

Tôi có thể thực thi cấu hình bản đồ của tôi giảm trong javascript nơi phạm vi được truyền trong chứa các chức năng tiện ích, nhưng tôi không thể tìm ra cách làm điều này với trình điều khiển java.

tôi thiết lập phạm vi sử dụng mapReduceCommand của

c.addExtraOption("scope",new BasicDBObject().append('average',function(){ return false;}));

Tuy nhiên tôi không thể có được những người vẽ bản đồ/hạ nhận ra phạm vi thành phần 'ví dụ' trung bình như một hàm. Nếu tôi sử dụng dấu ngoặc kép, bản đồ giảm ngữ cảnh nghĩ rằng nó là một String, nhưng nếu không, tôi dường như không thể làm cho phân tích thành phần phạm vi.

Làm cách nào để có được hàm trong thành phần phạm vi thông qua trình điều khiển java?

Nhờ câu trả lời của Ren, đây là cấu hình bean mùa xuân để thiết lập phạm vi cho trình điều khiển java mongodb bằng hàm.

<util:map id="mrScope" 
       key-type="java.lang.String" 
       value-type="java.lang.Object"> 
    <entry key="buckets"><bean class="com.mongodb.util.JSON" factory-method="parse"><constructor-arg value="[0,10,15,20,25,30,35,40,45,50,55,60,65]"/></bean></entry> 
    <entry key="average"> 
     <bean class="org.bson.types.CodeWScope"> 
      <constructor-arg value="function() {var s = 0;for (var i = 0; i &gt; arguments.length; i++) s += arguments[i];return s/arguments.length;}"/> 
      <constructor-arg><bean class="org.bson.BasicBSONObject"/></constructor-arg> 
     </bean> 
    </entry> 
+0

Bạn có thể vui lòng cung cấp thêm chi tiết như cách sử dụng Map làm đối tượng phạm vi .. Có thể không? – gsuresh92

Trả lời

8

Mã máy chủ tự động chuyển đổi bản đồ và giảm vào chức năng Javascript, nhưng không phải như vậy với phạm vi. Để vượt qua một chức năng trong các tùy chọn phạm vi, bạn có thể làm điều này thay vì:

c.addExtraOption("scope", new BasicBSONObject("average", 
    new CodeWScope("function(){ return false;}", new BasicBSONObject()))); 
+0

Tuyệt vời, cảm ơn! – gbegley

+0

Cảm ơn Ren. Phần này của Mongo cũng không được ghi lại như một số người thích :) Vì vậy, tốt nhất là tìm câu trả lời. –

1

Với api mới (3.0) .. Tôi tìm thấy tùy chọn bên dưới đang làm việc

collection .mapReduce(map, reduce) .scope(new Document("key", value)) .limit(100);

1

Đối với những người đấu tranh với việc áp dụng hàm trong phạm vi sử dụng MongoTemplate, ví dụ bên dưới dường như hoạt động:

Map<String, Object> scopeVariables = new HashMap<>(); 
    String scopeFunction="function(){ //do something }"; 
    scopeVariables.put("transform", new CodeWScope(scopeFunction,new BasicBSONObject())); 

    MapReduceOptions options = new MapReduceOptions(); 
    options.scopeVariables(scopeVariables); 
    options.outputTypeInline(); 

    MapReduceResults<ValueObject> result = template.mapReduce("collection", mapFunction, reduceFunction, options, ValueObject.class); 

Sau khi chạy mã trên, hàm transform() sẽ hiển thị trong bản đồ f unction:

var mapFunction=function(){ 
    transform(); 
    emit(key,value); 
}