我在我的应用程序中使用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项列表,如果是,则获取空列表 没有。
我理解为获取更新或插入的项目列表。
答案 0 :(得分:1)
来自BulkWriteUpsert
表示生成的批量写入操作中的upsert请求 插入。它包含了upsert请求的索引 操作和插入文档的_id字段的值。
因此它包含导致插入但不更新的写操作。
如果更新,此属性可能与您BulkWriteResult.nModified
答案 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个案例中matchedCount
,modifiedCount
和upserts
的计数差异:
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