【发布时间】: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,这是新问题