如何找到文档并在找到时检索它,但如果在一个命令中找不到则会插入并检索它?
我希望我的文档看起来像用户数据的格式大纲。这是它的样子
{
"username": "HeyAwesomePeople",
"uuid": "0f91ede5-54ed-495c-aa8c-d87bf405d2bb",
"global": {},
"servers": {}
}
当用户首次登录时,我想存储前两个数据值(用户名和uuid)并创建那些空值(全局和服务器。这些全局服务器和服务器稍后将填充更多信息,但现在他们可能是空白的)。但是如果用户已经存在数据,我也不想覆盖任何数据。
我通常会使用insertOne或updateOne调用该集合,然后使用upsert(new UpdateOptions()。upsert(true))选项插入如果找不到但在这种情况下我还需要检索用户的文件以及。
因此,在数据库中找不到用户的情况下,我需要将概述的数据插入数据库并返回保存的文档。如果在数据库中找到用户,我只需要从数据库中返回文档。
我该怎么做呢?我使用的是最新版本的Mongo,它已弃用旧的BasicDBObject类型,所以我找不到很多使用新“文档”类型的在线地方。此外,我正在使用java的Async驱动程序,并希望将调用保持在最低限度。
答案 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进行了测试。