又一张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)?
答案 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/SalatDAO和https://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: _*)