MongoDB Java异步驱动程序:阻止<document> vs SingleResultCallBack <document>

时间:2015-07-23 11:50:09

标签: mongodb mongodb-java

我刚刚开始学习mongodb java驱动程序的异步API。大多数示例覆盖 SingleResultCallback的 onResult方法,如下所示:

 // get it (since it's the only one in there since we dropped the rest earlier on)
    collection.find().first(new SingleResultCallback<Document>() {
        @Override
        public void onResult(final Document document, final Throwable t) {
            System.out.println(document.toJson());
        }
    });    

执行查询并返回响应/错误时执行此回调。

但是,在FindIterable的情况下,我们需要将Block的apply方法覆盖为第一个参数,将SingleResultCallback的onResult方法覆盖为sencond参数。

FindIterable<Document> iterable = db.getCollection("restaurants").find();
    // @code: end

    // @pre: Iterate the results and apply a block to each resulting document
    // @code: start
    iterable.forEach(new Block<Document>() {
        @Override
        public void apply(final Document document) {
            System.out.println(document);
        }
    }, new SingleResultCallback<Void>() {
        @Override
        public void onResult(final Void result, final Throwable t) {
            System.out.println("Operation Finished");
        }
    });

我无法理解为什么我们需要同时使用Block和SingleResultCallBack。我们可以在Block中执行哪些操作/操作,而我们无法使用SingleResultCallBack?

1 个答案:

答案 0 :(得分:0)

Block适用于迭代的每个项目。迭代完成后执行SingleResultCallback

com.mongodb.async.client.MongoIterable的{​​{3}}说:

  

迭代视图中的所有文档,将给定的块应用于   每个,并在所有文件完成后完成返回的未来   迭代,或发生异常。