2017-02-27 20 views
0

如何找到一個文檔並找到它,如果找到,但插入並檢索它,如果沒有在一個命令中找到?使用MongoDB 3.4加載和保存用戶數據

我希望我的文檔看起來像用戶數據的格式大綱。這裏是什麼樣子

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

當用戶第一次登錄時,我想存儲數據的前兩個值(用戶名和UUID),並創建這些空值(全球和服務器。這兩項全球性和服務器稍後將有更多的信息填入其中,但現在它們可以是空白的)。但我也不想覆蓋任何數據,如果它已經存在的用戶。

我通常會使用insertOne或updateOne調用集合,然後使用upsert(new UpdateOptions()。upsert(true))選項插入,如果找不到,但在這種情況下,我還需要檢索用戶的文檔也是如此。

因此,在數據庫中找不到用戶的情況下,我需要將概述數據插入數據庫並返回保存的文檔。在數據庫中找到用戶的情況下,我需要從數據庫中返回文檔。

我該怎麼做呢?我正在使用最新版本的Mongo,它棄用了舊的BasicDBObject類型,所以我無法在網上找到許多使用新「文檔」類型的地方。另外,我正在使用Java的Async驅動程序,並希望將呼叫保持在最低限度。

+0

什麼是您的過濾標準?在插入新記錄之前如何檢查記錄? – Veeram

回答

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選項是在執行操作後返回文檔。

UPSERTreturnDocument標誌對教程/實例FindOneAndUpdateOptions

參見MongoDB Async Java Driver v3.4的一部分。上面的代碼片段用當前版本的MongoDB v3.4.x進行了測試。

相關問題