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

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

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


问题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 protected]}}, Document{{firstName=Alex, [email protected]}}], lastModifiedTs=TS time:null inc:0, _id=5a6b88a66cafd010f1f2cffd}}


问题二

如果我要更新货件,则跟踪号是相同的,但其他所有字段可能会更改。

以下代码崩溃:

    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”


因此,看起来我不能只将整个更新的文档放入“更新”中
如果仅将update设置为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);

10-08 17:54