java - MongoDB: "can' t 保存部分对象”异常

标签 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.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(query,projection) 查询特定字段

通过在查找操作的参数中指定projection,集合将返回一个部分对象。

从发布的堆栈跟踪中,当调用“插入”时,底层 API 正在运行 _checkObject(doc),它会抛出“部分对象”的异常,因为这与游标返回的实例相同。

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

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

参见 Findcollection sourcemap constructor .

关于java - MongoDB: "can' t 保存部分对象”异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17111533/

相关文章:

java - 在java中获取HashMap中的变量类型

node.js - 同步连接mongodb

javascript - MongoDB Node -mongodb- native 映射/减少

MySQL - 是否可以运行多个同步插入?

java - 将 hasNextInt 与 do-while 循环一起使用,负整数不会出现错误消息

java - 为什么在 Apache Pulsar 中使用 MessageListener 而不是简单地使用 Consumer.receive()?

javascript - 类型错误 : mongodb property insertmany is not a function

python - 在文本文件的指定位置插入行

php - 用于 PHP 的 MySQL 日期格式

java - 将 @FindBy 与我自己的类一起使用,而不是与 WebElement 一起使用