在我的应用程序中有2个主题:
为了检索已抓取的网站,我使用以下查询:
Document query = new Document("fetchStatus", new Document("$lte", fetchStatusParam));
FindIterable<Document> unfetchedEpisodes = dbC_Episodes.find(query);
结果我得到了所有剧集,其fetchStatusParam
小于或等于特定值。
下一步,我将结果集的项目存储在HashMap<String, TrackedEpisode>
中,这是一个对象属性,以便跟踪它们:
for (Document document : unfetchedEpisodes) {
this.trackedEpisodes.put(document.get("_id").toString(), new TrackedEpisode(document));
}
然后我做了一些业务逻辑,其中:
unfetchedEpisodes
结果集。trackedEpisodes
删除任何对象。到目前为止一切正常。
最后一步,我将所有检索到的文档都传递过来,并将它们标记为已提取,以防止将来重复提取。
for (Document document : unfetchedEpisodes) {
if (this.trackedEpisodes.containsKey(document.get("_id").toString())) {
// prevent repeated fetching
document.put("fetchStatus", FetchStatus.IN_PROCESS.getID());
if (this.trackedEpisodes.get(document.get("_id").toString()).isExpired()) {
document.put("isExpired", true);
document.put("fetchStatus", FetchStatus.FETCHED.getID());
}
} else {
System.out.println("BOO! Strange new object detected");
}
dbC_Episodes.updateOne(new Document("_id", document.get("_id")), new Document("$set", document));
}
我运行此代码几天,并注意到有时它会到达else
语句的if (this.trackedEpisodes.containsKey())
部分。这对我来说很奇怪,unfetchedEpisodes
和trackedEpisodes
如何不同步且不包含相同的项目?
我开始调查此案并注意到我到达"BOO! Strange new object detected"
document
迭代器的时间包含数据库中的项目但不应该在unfetchedEpisodes
中,因为我没有对数据库执行新查询。
我检查了几次将检索到的项目存储到trackedEpisodes
的问题,并且unfetchedEpisodes
中的所有元素都已添加到trackedEpisodes
但在此之后我仍然会到达{{ 1}}。
我的问题:
"BOO! Strange new object detected"
在执行查询后获取新项目?unfetchedEpisodes
后,MongoDB驱动程序是否可以修改unfetchedEpisodes
?Collection#query()
种吗?使用的版本: