4

在另一张 SO 海报(Vinicius Miana)解决了我的问题以插入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)

我已经检查了一篇与我完全相同的问题的帖子,但我不确定如何应用已接受的答案。

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

4

3 回答 3

3

您根本无法将 aMongoDBList插入集合中。如果你想在一个操作中插入多个文档,你只需要List[DBObject]直接传递你的 toinsert方法:

collection.insert(docs: _*)

之所以_*需要,是因为insert它是一个可变参数方法。

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

于 2013-09-27T20:48:53.503 回答
2

萨拉特作者在这里。Ghik 是正确的:您的问题是您将模型对象包装在一个虚假的MongoDBList. 此外,您似乎将模型对象直接提供给您的收藏。如果您要这样做,则需要在插入之前手动序列化每个对象。

我建议这种方法是不必要的!这是你需要做的。获取SalatDAOModelCompanion工作 - 请参阅https://github.com/novus/salat/wiki/SalatDAOhttps://github.com/novus/salat/wiki/SalatWithPlay2

SalatDAO这是一个名为的模型对象的示例实现MyObject

object MyObjectDAO extends SalatDAO[MyObject, ObjectId](collection = MongoConnection()("my_test_db")("my_test_coll"))

然后只需使用插入您的文档SalatDAO#insert(docs: Traversable[ObjectType], wc: WriteConcern = defaultWriteConcern)

MyObjectDAO.insert(docs)
于 2013-09-30T13:41:32.450 回答
1

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

您应该提供List[DBObject]然后分解为 vargs:

val docs = List[DBObject("a" -> "b")
collection.insert(docs: _*)
于 2013-09-30T13:37:44.343 回答