【问题标题】:mapReduce inline results with java mongodb driver 3.2使用 java mongodb 驱动程序 3.2 的 mapReduce 内联结果
【发布时间】:2016-06-13 08:59:27
【问题描述】:

如何使用 mongodb java 驱动程序 3.2 从 mapReducet 获得内联结果?

我正在使用驱动程序版本 2.x:

DBColleciont coll = client.getDB(dbName).getCollection(collName);
coll.mapReduce(map, reduce, null, OutputType.INLINE, query);

新的 3.x 驱动程序有两个 mapReduce() 方法返回 MapReduceIterable 缺少指定 INLINE 输出模式的方法。

MongoCollection<Documetn> coll = client.getDatabase(dbName).getCollection(collName)
coll
    .mapReduce(map, reduce).
    .filter(query);

【问题讨论】:

    标签: mongodb mongodb-java


    【解决方案1】:

    您可以手动创建 map-reduce 命令:

        String mapFunction = ...
        String reduceFunction = ...
    
        BsonDocument command = new BsonDocument();
    
        BsonJavaScript map = new BsonJavaScript(mapFunction);
        BsonJavaScript red = new BsonJavaScript(reduceFunction);
        BsonDocument query = new BsonDocument("someidentifier", new BsonString("somevalue"));
        command.append("mapreduce", new BsonString("mySourceCollection"));
        command.append("query", query);
        command.append("map", map);
        command.append("reduce", red);
        command.append("out", new BsonDocument("inline", new BsonBoolean(true)));
    
        Document result = mongoClient.getDatabase(database).runCommand(command);
    

    我认为这非常难看,但这是迄今为止我使用 3.2 找到的唯一可行的解​​决方案。 (......并且也会对更好的变体非常感兴趣......;-))

    【讨论】:

      【解决方案2】:

      我想我找到了... 我深入研究了 mongodb 的 Java 驱动程序源,似乎可以隐式访问 INLINE 输出功能:

      class MapReduceIterableImpl&lt;TDocument, TResult&gt;(MapReduceIterableImpl.java),这是接口返回类型mapReduce()的默认实现, 持有一个private boolean inline,初始值为true

      唯一可以切换到false的地方是方法collectionName(final String collectionName),其描述如下:

      为 MapReduce 的输出设置 collectionName 默认操作是替换集合(如果存在),以更改此使用操作(com.mongodb.client.model.MapReduceAction)。

      如果您在mapReduce() 之后从未在对象实例上调用此方法,则它将保持true 初始化...意思是:如果没有输出集合,则它必须是内联的。

      稍后,当您在内部使用 iterator(), first(), forEach(...) 等访问结果时,将调用 execute() 方法,该方法具有神奇的 if 条件:

      if (inline) {
              MapReduceWithInlineResultsOperation<TResult> operation =
                      new MapReduceWithInlineResultsOperation<TResult>(namespace,
                              new BsonJavaScript(mapFunction),
                              new BsonJavaScript(reduceFunction),
                              codecRegistry.get(resultClass))
                              .filter(toBsonDocument(filter))
                              .limit(limit)
                              .maxTime(maxTimeMS, MILLISECONDS)
                              .jsMode(jsMode)
                              .scope(toBsonDocument(scope))
                              .sort(toBsonDocument(sort))
                              .verbose(verbose)
                              .readConcern(readConcern);
      ....
      
      } else {
              MapReduceToCollectionOperation operation =
                      new MapReduceToCollectionOperation(namespace, new BsonJavaScript(mapFunction), new BsonJavaScript(reduceFunction),
                              collectionName)
                              .filter(toBsonDocument(filter))
                              .limit(limit)
                              .maxTime(maxTimeMS, MILLISECONDS)
                              .jsMode(jsMode)
                              .scope(toBsonDocument(scope))
                              .sort(toBsonDocument(sort))
                              .verbose(verbose)
                              .action(action.getValue())
                              .nonAtomic(nonAtomic)
                              .sharded(sharded)
                              .databaseName(databaseName)
                              .bypassDocumentValidation(bypassDocumentValidation);
      

      ...所以当 collectionName() 未被调用时,它正在实例化 MapReduceWithInlineResultsOperation

      我没有机会测试它,因为我的 NetBeans 目前讨厌我,但我认为这很清楚。 你觉得呢,我错过了什么吗?

      如果我能帮助您将代码转移到 API 3.x 将很高兴,很棒的项目!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-02
        • 1970-01-01
        • 2011-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        相关资源
        最近更新 更多