我正在尝试从一个集合中查询并使用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)
我需要在文档上调用一些“finalize”方法吗?我的代码是这样的:
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);
}
答案 0 :(得分:3)
您正在使用collection.find查询特定字段(查询,投影)
通过在查找操作的参数中指定投影,该集合将返回一个部分对象。
从发布的堆栈跟踪中,当调用'insert'时,底层API正在运行_checkObject(doc),它会抛出“部分对象”的异常,因为这是游标返回的相同实例。
你可以通过创建(new BasicDBObject(doc))有效地复制返回的部分对象,然后将副本保存到aggCollection来解决这个问题。
BasicDBObject doc = ...;
BasicDBObject copyOfDoc = new BasicDBObject(doc);
copyOfDoc.put("Time2", newDate);
aggCollection.insert(copyOfDoc);