我是scala的新手,我正在尝试创建自定义BsonDocument。据我在文档here中所述,此方法append(String key, BsonValue value)
在内部调用put
方法,我正在尝试使用它。
问题是,当我追加两个以上的字段时,只会追加最后两个字段。例如,如果我有这样的代码:
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"] } } }
如您所见,未附加userName。如果我改变顺序,它会重复最后两个附加元素。
我已经尝试直接使用put
,但仍然得到相同的结果。还试图像doc = doc.append(...)
一样单独添加,但仍然相同。
我在这里缺少什么?
答案 0 :(得分:1)
你不能有两个$set
(一个BSONDocument基本上是一个键值映射,再次附加相同的密钥就会重置它,就像Map.put
那样。)
你想要的是
"$set" : {
"color" : "teal",
"username": "Jim"
}
答案 1 :(得分:1)
由于$set
由BsonDocument
支持,因此您必须使用Map
键和两个值。
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))))