【问题标题】:Setting last modification timestamp when using insertOne and findOneAndUpdate使用 insertOne 和 findOneAndUpdate 时设置上次修改时间戳
【发布时间】:2018-01-27 04:31:55
【问题描述】:

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

除了:“无效的 BSON 字段名称 equipmentShipmentAddress

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

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

我怎样才能优雅地实现我的目标?

谢谢

【问题讨论】:

  • @veeram,这是新问题

标签: java mongodb


【解决方案1】:

问题 #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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2014-10-11
    • 1970-01-01
    • 2016-01-22
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多