java.lang.IllegalArgumentException:BasicBSONList只能使用数字键,而不是:[_ id]

时间:2013-09-27 19:52:00

标签: scala casbah

又一张SO海报(Vinicius Miana)解决了我的issue插入List[DBObject] ......

// Bulk insert all documents
collection.insert(MongoDBList(docs)) // docs is List[DBObject]

现在,我在尝试插入时看到了这个错误。

java.lang.IllegalArgumentException: BasicBSONList can only work with numeric keys, not: [_id]

编辑

完整堆栈跟踪

[info]   java.lang.IllegalArgumentException: BasicBSONList can only work with numeric keys, not: [_id]
[info]   at org.bson.types.BasicBSONList._getInt(BasicBSONList.java:161)
[info]   at org.bson.types.BasicBSONList._getInt(BasicBSONList.java:152)
[info]   at org.bson.types.BasicBSONList.get(BasicBSONList.java:104)
[info]   at com.mongodb.DBCollection.apply(DBCollection.java:767)
[info]   at com.mongodb.DBCollection.apply(DBCollection.java:756)
[info]   at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:220)
[info]   at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:204)
[info]   at com.mongodb.DBCollection.insert(DBCollection.java:76)
[info]   at com.mongodb.casbah.MongoCollectionBase$class.insert(MongoCollection.scala:508)
[info]   at com.mongodb.casbah.MongoCollection.insert(MongoCollection.scala:866)

我已经检查了post我遇到的完全相同的问题,但我不确定如何应用已接受的答案。

此错误是否意味着我无法插入任何键值对,以致value无法转换为Int(每BasicBSONList)?

3 个答案:

答案 0 :(得分:3)

您根本无法将MongoDBList插入到集合中。如果您想在一次操作中插入多个文档,只需将List[DBObject]直接传递给insert方法:

collection.insert(docs: _*)

_*是必需的,因为insert是一种varargs方法。

另一方面,我不得不承认这个异常在这里很混乱,而且它的错误信息与实际问题没有多大关系。我怀疑它发生是因为Casbah试图将MongoDBList视为可以插入数据库的常规文档。它试图访问它试图插入的对象的_id并导致异常。

答案 1 :(得分:2)

Salat作者在这里。 Ghik是正确的:你的问题是你将模型对象包裹在一个虚假的MongoDBList中。此外,您似乎直接将模型对象提供给您的集合。如果你要这样做,你需要在插入之前手动序列化每个对象。

我会建议这种方法是不必要的!这是你需要做的。让[{1}}或SalatDAO工作 - 请参阅https://github.com/novus/salat/wiki/SalatDAOhttps://github.com/novus/salat/wiki/SalatWithPlay2

以下是名为ModelCompanion的模型对象的SalatDAO示例实现:

MyObject

然后只需使用object MyObjectDAO extends SalatDAO[MyObject, ObjectId](collection = MongoConnection()("my_test_db")("my_test_coll"))

插入您的文档
SalatDAO#insert(docs: Traversable[ObjectType], wc: WriteConcern = defaultWriteConcern)

答案 2 :(得分:1)

MongoDBList与普通列表不同,它是BasicDBList的便捷包装器,因此转换为vargs不能按预期工作。

您应该提供List[DBObject]然后爆炸成vargs:

val docs = List[DBObject("a" -> "b")
collection.insert(docs: _*)