我在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中执行此操作,而不是在命令行中执行此操作。
答案 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 "));