在MongoDb中获取/返回新插入或新修改的文​​档(使用java驱动程序)

时间:2018-01-26 14:51:18

标签: java mongodb

我在MongoDb中插入/更新的文档有一个自动更新的currentDate,例如:

<streambuf>

了解&#34; lastModified&#34;的价值对我来说至关重要。我一写这个对象。由于WriteResult返回新插入的对象id,我只能获取对象:

> db.TEMP.update({"event" : "sold my iPhone"}, { $currentDate: {lastModified: true}} , {upsert: true} )
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5a6b3799a187fac295097a64")})

但这意味着每个操作(写入和读取)有2个DB操作。有没有办法让#34; WriteResult&#34;包含lastModified,或只返回新插入/更新的对象(甚至是光标到它)?

哦,我正在使用java驱动程序,因此我需要在Java中执行此操作,而不是在命令行中执行此操作。

2 个答案:

答案 0 :(得分:0)

而不是updateOne将其更改为findOneAndUpdate,并返回更新的文档

TDocument findOneAndUpdate(Bson filter, Bson update);

TDocument findOneAndUpdate(Bson filter, Bson update, FindOneAndUpdateOptions options);

实施例

    Document updatedDoc = collection.findOneAndUpdate(
            eq("name", "Café Con Leche"),
            combine(set("stars", 1), set("contact.phone", "228-555-9999"), currentDate("lastModified")));
    System.out.println(updatedDoc);

日志

20:41:44.748 [main] DEBUG org.mongodb.driver.protocol.command - Sending command {findandmodify : BsonString{value='restaurants'}} to database test on connection [connectionId{localValue:2, serverValue:21}] to server 127.0.0.1:27017
20:41:44.764 [main] DEBUG org.mongodb.driver.protocol.command - Command execution completed
Document{{_id=5a6b43d741b7d10d1cb3edb5, name=Café Con Leche, contact=Document{{phone=228-555-9999, email=cafeconleche@example.com, location=[-73.92502, 40.8279556]}}, stars=1, categories=[Bakery, Coffee, Pastries], lastModified=Fri Jan 26 20:40:34 IST 2018}}

答案 1 :(得分:0)

使用findOneAndUpdate以下FindOneAndUpdateOptions选项。

默认情况下,

findOneAndUpdate会在修改前返回文档。

更改为以下以返回整个更新文档。

FindOneAndUpdateOptions options = new FindOneAndUpdateOptions();
options.returnDocument(ReturnDocument.AFTER);
options.upsert(true);


Bson query = Filters.eq("event", "sold my iPhone");
Bson update =  Updates.currentDate("lastModified");
collection.findOneAndUpdate(query, update, options);

FindOneAndUpdateOptions中加入投影以返回lastModified字段。

options.projection(Projections.include("lastModified "));