【问题标题】:Create a list from DbCursor in MongoDB and Java在 MongoDB 和 Java 中从 DbCursor 创建一个列表
【发布时间】:2013-10-25 03:17:07
【问题描述】:

我正在尝试使用光标来遍历文档,我想将它们存储在一个列表中,然后返回一个 DBOject 类型的列表。

这是我正在尝试的:

public List<DBObject> getResultsInDescendingOrderByDate(int limit) {

        List<DBObject> myList = null;
        DBCursor myCursor=myCollection.find().sort(new BasicDBObject("date",-1)).limit(10);
        try {
        while(myCursor.hasNext()) {

                System.out.print(myCursor.next());
               myList.add(new BasicDBObject("_id",(String) myCursor.curr().get("_id"))
                        .append("title",(String) myCursor.curr().get("title"))
                        .append("author",(String) myCursor.curr().get("author"))
                        .append("permalink",(String) myCursor.curr().get("permalink"))
                        .append("body",(String) myCursor.curr().get("body"))
                        .append("comment",new BasicDBObject("comments",(String) myCursor.curr().get("comments")))
                                .append("tags",new BasicDBObject("tags",(String) myCursor.curr().get("tags"))
                                .append("date",(Date) myCursor.curr().get("date"))));
                myCursor.next();
            }
        }

        finally {
            myCursor.close();
        }


        return myList;
    }

我不知道如何将数据类型转换为游标的原始形式。我试过搜索,但没有任何线索。

请帮忙。

谢谢

【问题讨论】:

    标签: java mongodb


    【解决方案1】:

    @sdanzig 解决方案会起作用,但是... 如果你想输入更少的代码,你可以这样做:

    public List<DBObject> getResultsInDescendingOrderByDate(int limit) {
    
            List<DBObject> myList = null;
            DBCursor myCursor=myCollection.find().sort(new BasicDBObject("date",-1)).limit(10);
            myList = myCursor.toArray();
    
            return myList;
        }
    

    DBCursor 的DBCursor.toArray() 方法返回一个List

    【讨论】:

    • 警告:在 DBCursor 上调用 toArray 或 length 将不可撤销地将其转换为数组。这意味着,如果游标正在迭代超过一千万个结果(它是从数据库中延迟获取的),那么内存中就会突然出现一千万个元素的数组。在转换为数组之前,请确保使用 skip() 和 limit() 有合理数量的结果。例如,要获取游标的第 1000-1100 个元素的数组,请使用 List obj = collection.find( query ).skip( 1000 ).limit( 100 ).toArray(); api.mongodb.org/java/2.0/com/mongodb/DBCursor.html
    • 当然 toArray 方法可能会导致结果较大的问题,但这就是问题所在 - 如何将光标转到列表。
    • 我不同意这个答案,我认为它是正确的,我只是在光标中有大量结果时添加了一个警告。
    【解决方案2】:

    对于您要执行的操作,无需阅读各个字段。你必须初始化你的列表。另外,您在 print 语句中调用了 next() 两次。您可以只使用 next() 的返回值,而不是调用 curr()。哦,有人正确地建议你应该传递“限制”参数而不是使用 10,除非这是故意的:

    public List<DBObject> getResultsInDescendingOrderByDate(int limit) {
        List<DBObject> myList = new ArrayList<DBObject>();
        DBCursor myCursor=myCollection.find().sort(new BasicDBObject("date",-1)).limit(limit);
        try {
            while(myCursor.hasNext()) {
                myList.add(myCursor.next());
            }
        }
        finally {
            myCursor.close();
        }
        return myList;
    }
    

    【讨论】:

    • 嗨,sdanzig,非常感谢您的帮助。我得到了它的工作。
    • @sdanzig 你能解释一下我们为什么要关闭光标吗?不关闭光标有什么缺点吗?
    • @PratikPatel 游标消耗资源,因此关闭它们可以保持整洁。游标在耗尽时关闭(完全迭代),但如果只是部分迭代,显式关闭它们有助于避免等待 10 分钟超时以释放资源。
    • @sdanzig 您所说的内容是否记录在 Mongo Doc 中?没找到,能给个网址吗,谢谢。
    • @PratikPatel 按照我在这里读到的内容进行:stackoverflow.com/questions/24260677/… ... 问 Neil Lunn :)
    【解决方案3】:

    就我而言,我正在使用Documents

    List<Document> employees = (List<Document>) collection.find().into(
                    new ArrayList<Document>());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2020-04-20
      • 2014-06-29
      相关资源
      最近更新 更多