簡體   English   中英

MongoDB:“無法保存部分對象”異常

[英]MongoDB: “can't save partial objects” exception

我正在嘗試從一個集合中查詢並使用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(查詢, 投影 )查詢特定字段

通過在查找操作的參數中指定投影 ,集合將返回一個部分對象。

從發布的堆棧跟蹤中,當調用'insert'時,底層API正在運行_checkObject(doc),它會拋出“部分對象”的異常,因為這是游標返回的相同實例。

你可以通過創建(new BasicDBObject(doc))有效地復制返回的部分對象,然后將副本保存到aggCollection來解決這個問題。

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

請參見查找集合源以及映射構造函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM