2017-03-07 74 views
0

我是新來的斯卡拉,我想創建一個自定義的BsonDocument。據我在文檔here中讀到,有這種方法append(String key, BsonValue value),它在內部調用put方法,我試圖使用它。斯卡拉/ Java的BsonDocument append不能正常工作

問題是,當我追加兩個以上的字段時,只有最後兩個字段被追加。例如,如果我有這樣的代碼:

var doc = new BsonDocument(); 
val mapAccounts = user.accounts.map(e => new BsonString(e))  
doc.append("$set", new BsonDocument("userName", new BsonString(user.userName))) 
.append("$set", new BsonDocument("color", new BsonString(user.color))) 
.append("$addToSet", new BsonDocument("accounts", new BsonDocument("$each", new BsonArray(mapAccounts.toList.asJava)))) 

println(s"The Bson user is $doc") 

在這種情況下,我得到這樣的輸出:

The Bson user is { "$set" : { "color" : "teal" }, "$addToSet" : { "accounts" : { "$each" : ["1"] } } } 

正如你所看到的,用戶名不是被追加。如果我更改順序,它會重複最後兩個附加元素。

我已經嘗試直接使用put,但仍得到相同的結果。也試圖像doc = doc.append(...)一樣單獨附加,並且仍然相同。

我在這裏錯過了什麼?

回答

1

你不能有兩個$set(一個BSONDocument基本上是一個鍵值映射,並且再次追加同一個鍵就會重置它,就像Map.put那樣)。

你想要的是

"$set" : { 
    "color" : "teal", 
    "username": "Jim" 
} 
1

你必須使用$set鍵與這兩個值作爲BsonDocumentMap支持。

doc.append("$set", new BsonDocument("userName", new BsonString(user.userName)).append("color", new BsonString(user.color))) 
       .append("$addToSet", new BsonDocument("accounts", new BsonDocument("$each", new BsonArray(mapAccounts.toList.asJava))))