Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MongoDB:“;can';t保存部分对象“;例外_Java_Mongodb_Insert_Database - Fatal编程技术网

Java MongoDB:“;can';t保存部分对象“;例外

Java MongoDB:“;can';t保存部分对象“;例外,java,mongodb,insert,database,Java,Mongodb,Insert,Database,我试图使用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.i

我试图使用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);
}

您正在使用collection.find(查询,投影)查询特定字段

通过在find操作的参数中指定投影,集合将返回部分对象

从发布的堆栈跟踪中,当调用“insert”时,底层API正在运行_checkObject(doc),这会引发“partial object”的异常,因为这是游标返回的同一个实例

您可以通过创建(新的BasicDBObject(doc))有效地复制返回的部分对象,然后将副本保存到集合来解决此问题

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

请参阅和。

似乎没有任何此类方法
新的基本对象(doc)
,是否有其他简单的方法来克隆文档?还是必须逐个字段?BasicDBObject的构造函数获取一个映射,创建一个包含映射中所有属性的对象。BasicDBObject还实现了Map接口,因此您可以通过将源对象用作Map实例(不是吗?)来创建一个新的BasicDBObject,其所有属性都与BasicDBObject 1相同。我将用一个代码示例编辑答案。让我大吃一惊的是,
BasicDBObject
实现了
Map
,但查询返回
DBObject
s,它没有实现
Map
。所以我只需要投。这不是最漂亮的界面,但它应该可以工作,谢谢。