我需要在MongoDb中插入/更新所有文档,以便自动更新currentDate
因此,我们假设我有以下Json 货件对象(我从第三方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 ,我需要将对象插入数据库并设置&#34; currentDate&#34;,但insertOne对我不起作用:< / p>
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);
这个没有填充&#34; lastModifiedTs&#34;你可以在下面看到
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);
例外:&#34;无效的BSON字段名称 equipmentShipmentAddress &#34;
注意:不用说,我可以执行几个操作:(1)插入对象,得到&#34; _id&#34;字段,(2)更新&#34; lastModifiedTs&#34; field(3)通过&#34; _id&#34;读取对象并获得更新的&#34; lastModifiedTs&#34;价值,但它是我希望通过单一操作实现一切的三个操作
如何才能优雅地实现我的目标?
由于
答案 0 :(得分: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);