1

我正在尝试从数据存储中删除一个对象,但它没有删除它。代码如下:

MoIADocument moIADoc = new MoIADocument();
// update fields in moIADoc object
ds.save(moIADoc);

printDBDocs();

// create a query to retrieve objects
QueryResults<MoIADocument> foundResults = dao.find(query);
List<MoIADocument> list = foundResults.asList();

for (MoIADocument obj : list) {
    ds.delete(obj);
    MoDBIATopic topicBO = obj.getData().get(EnumChannelType.FACEBOOK).getData().get(GraphConstants.Topic_Default);
    topicBO.setInfluence(topicBO.getInfluence() * 25);
    ds.save(obj);
}
printDBDocs();

########################### 第一次打印的结果(JSON 格式)是:

第一个打印结果

###########################for循环中的 obj是:

for循环中的obj

########################### 在 for 循环之后, print 语句给出了两个对象:

最后打印结果

为什么它不删除旧对象mongoConstants.ds.delete(obj);?我已经注释了id字段 ad@Id但仍然有两个对象保存为相同的id. 这怎么可能?如果相同,我们如何强制覆盖对象id

@Id
@Indexed
private String id;

注意:是JSON 中指示id的顶级级别。id

我尝试使用查询:

Query<MoIADocument> query1 = ds.createQuery(MoIADocument.class).disableValidation();
query1.field("id").equal(obj.getId());
ds.delete(query1);

这也没有按预期工作。

EDIT:

问题看起来像查询结果。使用 above query1,它返回零结果。

4

2 回答 2

0

我尝试了多种方法,但没有按预期工作..尝试了以下方法:

方法#1:

Query<MoDBIADocument> query1 = dao.createQuery(MoDBIADocument.class).disableValidation();
query1.field("id").equal(moDoc.getId());
QueryResults<MoDBIADocument> foundResults1 = dao.find(query1);
printDBDocs(foundResults1);

方法#2:(使用_id代替id

Query<MoDBIADocument> query1 = dao.createQuery(MoDBIADocument.class).disableValidation();
query1.field("_id").equal(moDoc.getId());
QueryResults<MoDBIADocument> foundResults1 = dao.find(query1);
printDBDocs(foundResults1);

方法#3:

using `ds` instead of `dao` in `Approach# 1` and `Approach# 2`

方法#4:

DBObject dbObj = new BasicDBObject("id", moDoc.getId());
DBCursor cursor = COLLECTION.find(dbObj);

上述方法都不起作用..我认为问题在于使用顶级id字段(不知何故?)..

使用内部 id (of FACEBOOK) 按预期工作

query1.field("data.FACEBOOK.id").equal(str);
于 2013-07-04T13:27:51.990 回答
0

问题是使用String idas@Id字段。其实应该是ObjectId id。随着这个变化类变成如下:

@Entity("Collection_IAGlobals")
public class MoDBIADocument {
    @Id
    @Indexed
    private ObjectId id;
    // some more fields
}

并更新为:

QueryResults<MoIADocument> foundResults = dao.find(query);
List<MoIADocument> list = foundResults.asList();
for (MoIADocument obj : list) {
    //do modifications in obj
    dao.save(obj);
}

这样就不需要delete旧对象了。它用新对象替换旧对象(因为它们具有相同的id)。

使用ds和都可以正常工作dao

但是现在,设置id字段的新问题。如果我使用一些字符串设置为:

moIADoc.setId(new ObjectId("123456"));

它导致以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: invalid ObjectId [123456]
    at org.bson.types.ObjectId.<init>(ObjectId.java:128)
    at org.bson.types.ObjectId.<init>(ObjectId.java:122)

它适用于任何其他方法,例如:

// don't set id field
//OR
//set using default constructor of ObjectId
moIADoc.setId(new ObjectId());
//OR use other constructors e.g.
moIADoc.setId(new ObjectId(new Date(), 123456));

那么,问题是为什么ObjectId不接受String争论呢?

于 2013-07-04T14:10:08.370 回答