具有upsert选项的mongo BulkWriteOperation不会返回用于更新的upserted条目

时间:2017-04-12 21:40:45

标签: java mongodb mongo-java-driver

我在我的应用程序中使用mongo-java-driver-3.0.4 jar。我的mongodb版本是3.2.10

基本上我尝试的是进行批量写入操作来创建或插入文档。我正在使用upsert选项尝试此操作。我注意到以下几点:

  • 每当创建新文档时,BulkWriteResult#getUpserts()都会使用创建的文档返回List<BulkWriteUpsert>

  • 但是,当我尝试更新现有文档时,BulkWriteResult#getUpserts()会返回一个空数组。

我使用以下代码段:

DBCollection coll = getDBCollection();
BulkWriteOperation bulkWriteOperation = coll.initializeUnorderedBulkOperation();
for() { //in a loop to populate the bulkWriteOperation
  DBObject obj = getDbObject();
  bulkWriteOperation.find(getQueryObject()).upsert().replaceOne(obj);
}

BulkWriteResult result = bulkWriteOperation.execute(writeConcern)

这看起来是驱动程序中的一个错误,但我不确定,因为根据api我看到了这个描述:

  

获取不可修改的upserted项列表,如果是,则获取空列表   没有。

我理解为获取更新或插入的项目列表。

2 个答案:

答案 0 :(得分:1)

来自BulkWriteUpsert

的java docs
  

表示生成的批量写入操作中的upsert请求   插入。它包含了upsert请求的索引   操作和插入文档的_id字段的值。

因此它包含导致插入但不更新的写操作。

如果更新,此属性可能与您BulkWriteResult.nModified

相关

有关BulkWriteResult

的详情,请点击此处

答案 1 :(得分:1)

仅当upsert导致插入时才会填充upsert。这是一个MCVE,展示了:

public class BulkUpsertTest {

    public static void main(String args[]) throws UnknownHostException {
        MongoClient m = new MongoClient("localhost");
        DBCollection coll = m.getDB("test").getCollection("bulkUpsertTest");
        coll.drop(); // drop the collection so that first iteration is insert
        test(coll); // first iteration insert
        test(coll); // second iteration update
    }

    public static void test(DBCollection coll) {
        BulkWriteOperation bulkWriteOperation = coll.initializeUnorderedBulkOperation();
        for(int i = 0; i < 3; i++) { 
          DBObject query = new BasicDBObject("_id", i);
          DBObject obj = new BasicDBObject("x", i);
          bulkWriteOperation.find(query).upsert().replaceOne(obj);
        }

        BulkWriteResult result = bulkWriteOperation.execute();
        List<BulkWriteUpsert> upserts = result.getUpserts();

        System.out.println("result: " + result);

        if (upserts != null) {
            System.out.println("Upserts size: " + upserts.size());
        } else {
            System.out.println("Upserts is null");
        }
    }


}

输出(注意2个案例中matchedCountmodifiedCountupserts的计数差异:

result: AcknowledgedBulkWriteResult{insertedCount=0, matchedCount=0, removedCount=0, modifiedCount=0, upserts=[BulkWriteUpsert{index=0, id=0}, BulkWriteUpsert{index=1, id=1}, BulkWriteUpsert{index=2, id=2}]}
Upserts size: 3
result: AcknowledgedBulkWriteResult{insertedCount=0, matchedCount=3, removedCount=0, modifiedCount=3, upserts=[]}
Upserts size: 0