gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:42:16 24 4
gpt4 key购买 nike

我需要在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com