使用MongoDB 3.4加载和保存userdata

时间:2017-02-27 05:50:21

标签: java mongodb asynchronous

如何找到文档并在找到时检索它,但如果在一个命令中找不到则会插入并检索它?

我希望我的文档看起来像用户数据的格式大纲。这是它的样子

{
  "username": "HeyAwesomePeople",
  "uuid": "0f91ede5-54ed-495c-aa8c-d87bf405d2bb",
  "global": {},
  "servers": {}
}

当用户首次登录时,我想存储前两个数据值(用户名和uuid)并创建那些空值(全局和服务器。这些全局服务器和服务器稍后将填充更多信息,但现在他们可能是空白的)。但是如果用户已经存在数据,我也不想覆盖任何数据。

我通常会使用insertOne或updateOne调用该集合,然后使用upsert(new UpdateOptions()。upsert(true))选项插入如果找不到但在这种情况下我还需要检索用户的文件以及。

因此,在数据库中找不到用户的情况下,我需要将概述的数据插入数据库并返回保存的文档。如果在数据库中找到用户,我只需要从数据库中返回文档。

我该怎么做呢?我使用的是最新版本的Mongo,它已弃用旧的BasicDBObject类型,所以我找不到很多使用新“文档”类型的在线地方。此外,我正在使用java的Async驱动程序,并希望将调用保持在最低限度。

1 个答案:

答案 0 :(得分:0)

  

如何找到文档并在找到时检索它,但如果在一个命令中找不到则会插入并检索它?

您可以使用findOneAndUpdate()方法查找和更新/ upsert。

MongoDB Java驱动程序公开了相同的方法名findOneAndUpdate()。例如:

// Example callback method for Async
SingleResultCallback<Document> printDocument = new SingleResultCallback<Document>() {
    @Override
    public void onResult(final Document document, final Throwable t) {
        System.out.println(document.toJson());
    }
};


Document userdata = new Document("username","HeyAwesomePeople")
                       .append("uuid", "0f91ede5")
                       .append("global", new Document())
                       .append("servers", new Document());


collection.findOneAndUpdate(userdata,
                            new Document("$set", userdata), 
                            new FindOneAndUpdateOptions()
                                .upsert(true)
                                .returnDocument(ReturnDocument.AFTER),
                            printDocument);

上面的查询将尝试查找与userdata匹配的文档;如果找到,则将其设置为与userdata相同的值。如果未找到,upsert布尔标志会将其插入集合中。 returnDocument选项是在执行操作后返回文档。

upsert returnDocument 标志是FindOneAndUpdateOptions

的一部分

有关教程/示例,另请参阅MongoDB Async Java Driver v3.4。上面的代码段已使用当前版本的MongoDB v3.4.x进行了测试。