使用insertOne和findOneAndUpdate

时间:2018-01-26 20:25:55

标签: java mongodb

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

  • 所以看起来我不能只将整个更新后的文件放入&#34;更新&#34;
  • 如果我只将更新设置为Updates.currentTimestamp(&#34; lastModifiedTs&#34;),代码将仅更新字段&#34; lastModifiedTs&#34;,但我需要它来修改所有字段。< / LI>
  • 如果我将查询设置为新对象,那么由于我的&#34; upsert&#34;设置,它将添加新文档而不替换旧文档。

注意:不用说,我可以执行几个操作:(1)插入对象,得到&#34; _id&#34;字段,(2)更新&#34; lastModifiedTs&#34; field(3)通过&#34; _id&#34;读取对象并获得更新的&#34; lastModifiedTs&#34;价值,但它是我希望通过单一操作实现一切的三个操作

如何才能优雅地实现我的目标?

由于

1 个答案:

答案 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);