从MongoDB和Java中的DbCursor创建一个列表

ApJ*_*pJo 9 java mongodb

我试图使用游标迭代文档,我想将它们存储在列表中,然后返回类型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;
    }
Run Code Online (Sandbox Code Playgroud)

我不知道如何将数据类型转换为光标中的原始数据类型.我试着搜索,但没有线索.

请帮忙.

谢谢

Dmi*_*tri 15

@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;
    }
Run Code Online (Sandbox Code Playgroud)

所述DBCursor.toArray() DBCursor的方法返回一个列表

  • 警告:在DBCursor上调用阵列或长度将不可逆转地将其转换为数组.这意味着,如果光标迭代超过一千万个结果(它从数据库中懒洋洋地取出),突然会在内存中有一千万个元素数组.在转换为数组之前,请确保使用skip()和limit()有合理数量的结果.例如,要获取游标的1000-1100个元素的数组,请使用List obj = collection.find(query).skip(1000).limit(100).toArray(); http://api.mongodb.org/java/2.0/com/mongodb/DBCursor.html (8认同)

sda*_*zig 5

对于您要做的事情,无需阅读各个字段.您必须初始化列表.另外,你在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;
}
Run Code Online (Sandbox Code Playgroud)

  • @PratikPatel游标消耗资源,因此关闭它们可以保持整洁.游标在耗尽时完全关闭(完全迭代),但如果只是部分迭代,则明确关闭它们有助于避免等待10分钟超时来释放资源. (2认同)