1

Java API を使用して、あるコレクションからクエリを実行し、別のコレクションに挿入しようとしていますが、理解できない例外が発生します。

Exception in thread "main" java.lang.IllegalArgumentException: can't save partial objects
    at com.mongodb.DBCollection._checkObject(DBCollection.java:1380)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:222)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:205)
    at com.mongodb.DBCollection.insert(DBCollection.java:57)
    at com.mongodb.DBCollection.insert(DBCollection.java:100)

ドキュメントなどで呼び出す必要がある「ファイナライズ」メソッドはありますか? 私のコードは次のようになります。

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;

Mongo mongo = new Mongo("mongodb://...");
DB db = mongo.getDB("foo");
DBCollection rawCollection = db.getCollection("foo1");
DBCollection aggCollection = db.getCollection("foo2");

DateTimeZone tz = DateTimeZone.forOffsetHours(-5);

BasicDBObject toGrab = new BasicDBObject("Time1", 1).append("col2", 1).append("col3", 1);
DBCursor c = rawCollection.find(null, toGrab).limit(10);

for (DBObject doc : c) {
  Date newDate = new DateTime( ((BasicBSONObject) doc).getDate("Time1") )
                   .withZone(tz).monthOfYear().roundCeilingCopy()
                   .withZone(DateTimeZone.UTC).toDate();

  doc.put("Time2", newDate);

  aggCollection.insert(doc);
}
4

1 に答える 1

3

collection.find(query, project )を使用して特定のフィールドを照会しています

検索操作の引数で射影を指定することにより、コレクションは部分的なオブジェクトを返します。

投稿されたスタック トレースから、「insert」を呼び出すと、基になる API が _checkObject(doc) を実行しています。これは、「部分オブジェクト」の例外をスローします。これは、カーソルによって返されるインスタンスと同じであるためです。

(new BasicDBObject(doc)) を作成して、返された部分オブジェクトを効果的にコピーし、そのコピーを aggCollection に保存することで、これを回避できます。

BasicDBObject doc = ...;
BasicDBObject copyOfDoc = new BasicDBObject(doc);
copyOfDoc.put("Time2", newDate);
aggCollection.insert(copyOfDoc);

Findコレクション ソースおよびマップ コンストラクターを参照してください。

于 2013-06-14T16:01:08.433 に答える