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)

まったく同じ問題を抱えた投稿をチェックアウトしましたが、受け入れられた回答を適用する方法がわかりません。

このエラーは、 ( BasicBSONListvalueごとに) キャストできないようなキーと値のペアを挿入できないことを意味しますか?Int

4

3 に答える 3

3

MongoDBListコレクションにa を挿入することはできません。1 回の操作で複数のドキュメントを挿入する場合は、メソッドにList[DBObject]直接渡す必要があります。insert

collection.insert(docs: _*)

は可変引数メソッドである_*ため必要です。insert

一方で、この例外は非常に紛らわしく、エラー メッセージは実際の問題とあまり関係がないことを認めなければなりません。MongoDBListデータベースに挿入できる通常のドキュメントとしてCasbah が処理しようとしているために発生したと思われます。_id挿入しようとするオブジェクトにアクセスしようとすると、例外が発生します。

于 2013-09-27T20:48:53.503 に答える
2

Salat author here. Ghik is correct: your problem is that you are wrapping your model objects in a spurious MongoDBList. Also, you appear to be feeding model objects directly to your collection. If you're going to do that, you need to manually serialize each object before inserting it.

I would recommend this approach is unnecessary! Here's what you need to do. Get either SalatDAO or ModelCompanion working - see https://github.com/novus/salat/wiki/SalatDAO and https://github.com/novus/salat/wiki/SalatWithPlay2.

Here's a sample implementation of SalatDAO for a model object called MyObject:

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

Then just insert your docs using SalatDAO#insert(docs: Traversable[ObjectType], wc: WriteConcern = defaultWriteConcern)

MyObjectDAO.insert(docs)
于 2013-09-30T13:41:32.450 に答える