执行查询后,MongoDB结果集被修改

时间:2016-02-21 10:41:51

标签: java mongodb synchronization

在我的应用程序中有2个主题:

  1. 抓取网站并将数据插入MongoDB
  2. 检索已抓取的网站并执行业务逻辑
  3. 为了检索已抓取的网站,我使用以下查询:

    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())部分。这对我来说很奇怪,unfetchedEpisodestrackedEpisodes如何不同步且不包含相同的项目?

    我开始调查此案并注意到我到达"BOO! Strange new object detected" document迭代器的时间包含数据库中的项目但不应该在unfetchedEpisodes中,因为我没有对数据库执行新查询。

    我检查了几次将检索到的项目存储到trackedEpisodes的问题,并且unfetchedEpisodes中的所有元素都已添加到trackedEpisodes但在此之后我仍然会到达{{ 1}}。

    我的问题:

    1. 为什么"BOO! Strange new object detected"在执行查询后获取新项目?
    2. 执行unfetchedEpisodes后,MongoDB驱动程序是否可以修改unfetchedEpisodes
    3. 在从MongoDB执行查询后,我应该使用Collection#query()种吗?
    4. 使用的版本:

      1. MongoDB:3.2.3,x64
      2. MongoDB Java驱动程序: mongodb-driver-3.2.2 mongodb-driver-core-3.2.2 bson-3.2.2

0 个答案:

没有答案