java - 使用 insertOne 和 findOneAndUpdate 时设置上次修改时间戳

标签 java mongodb

我需要在 MongoDb 中插入/更新的所有文档都具有自动更新 currentDate

因此,假设我有以下 Json shipment 对象(我从第 3 方 Restful API 获取):

String jsonString = {"tracking_number": "123", "deliveryAddress": { "street_line_1": "12 8th St.", "city": "NY", "state": "NY" }, "cutomers": [ { "firstName": "John", "email": "john@gmail.com" }, { "firstName": "Alex", "email": "alex@gmail.com" } ] }

问题#1,我需要将对象插入数据库并设置“currentDate”,但 insertOne 对我不起作用:

    MongoClient mongo = new MongoClient(mongodb_host, mongodb_port);
    MongoDatabase db = mongo.getDatabase("Test");
    MongoCollection<Document> collection = db.getCollection("InsertOneExample");
    Document doc = Document.parse(jsonString);
    doc.append("lastModifiedTs", new BSONTimestamp());
    collection.insertOne(doc);
    System.out.println(doc);

这不会填充“lastModifiedTs”,如下所示

Document{{tracking_number=123, deliveryAddress=Document{{street_line_1=12 8th St., city=NY, state=NY}}, cutomers=[Document{{firstName=John, email=john@gmail.com}}, Document{{firstName=Alex, email=alex@gmail.com}}], lastModifiedTs=TS time:null inc:0, _id=5a6b88a66cafd010f1f2cffd}}

问题#2

如果我收到货件的更新信息,追踪号码是相同的,但所有其他字段可能会发生变化。

以下代码崩溃:

    FindOneAndUpdateOptions options = new FindOneAndUpdateOptions();
    options.returnDocument(ReturnDocument.AFTER);
    options.upsert(true);
    Bson update = Updates.combine(Document.parse(jsonString), Updates.currentTimestamp("lastModifiedTs"));
    Document query = new Document("tracking_number", "123");
    Document result = collection.findOneAndUpdate(query, update, options);

异常(exception):“无效的 BSON 字段名称 equipmentShipmentAddress

  • 所以看来我不能只是将整个更新的文档放入“更新”
  • 如果我仅将更新设置为 Updates.currentTimestamp("lastModifiedTs"),则代码将仅更新字段“lastModifiedTs”,但我需要它来修改所有字段。
  • 如果我将查询设置为新对象,那么由于我的“upsert”设置,它将添加新文档而不替换旧文档。
<小时/>

注释:不用说,我可以执行几个操作:(1)插入对象,获取“_id”字段,(2)更新“lastModifiedTs”字段(3)通过“_id”读取对象并获取更新的“lastModifiedTs”值,但它是三个操作,我希望能够通过单个操作实现所有操作

如何优雅地实现我的目标?

谢谢

最佳答案

问题 #1 的解决方案 - 插入 new Date() 以提供新的日期时间。

Document doc = Document.parse(jsonString);
doc.append("lastModifiedTs", new Date());
collection.insertOne(doc);

问题 #2 的解决方案 - 使用 findOneAndReplace

FindOneAndReplaceOptions options = new FindOneAndReplaceOptions();
options.returnDocument(ReturnDocument.AFTER);
Document replace = Document.parse(jsonString);
replace.append("lastModifiedTs", new Date());
Document query = new Document("tracking_number", "123");
Document result = collection.findOneAndReplace(query, replace, options);

关于java - 使用 insertOne 和 findOneAndUpdate 时设置上次修改时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48469041/

相关文章:

java - 使用 Spring Security 注册创建 session

java - 获取对 Set 中重复项的引用

java - java中如何将 'hashtags'的字符串转换为json?

java - Spring Boot Java后端应用程序进程被杀死

ruby - MongoDB聚合数据生成 'latest activity'

mongodb - DynamoDB 相对于其他 NoSQL 数据库的优缺点是什么?

java - spring-boot RabbitListener 如何将单个队列绑定(bind)到单个线程?

mongodb - db.mydb.find({tag :'java' }).count() 和 db.mydb.count({tag :'java' }) 在 mongodb 中有什么区别

node.js - 如何使用nodejs在mongodb中进行文本索引

node.js - 查找 ObjectId _id 但 Schema 已将 _id 定义为 String