迭代具有有限批量大小的Mongo Cursor

时间:2015-05-12 11:44:17

标签: mongodb cursor mongodb-query

如何迭代以下数据光标? 以下代码给出了错误"

  

TypeError:对象[object Object]没有方法' forEach'

var data = db.profiles.runCommand("aggregate", {
    pipeline: [
        {$limit: 100000},
        {$unwind: "$Items"},
        {   $group: {
                _id: "$Items", count: {$sum: 1}
            },
        },
    ],
    allowDiskUse: true,
    cursor: { batchSize: 100 }
});

data.forEach(printjson) // gives error

数据变量包含以下内容

MongoDB shell version: 2.6.5
connecting to: myCollection

    {
        "cursor" : {
            "id" : NumberLong("61248019114"),
            "ns" : "myCollection.profiles",
            "firstBatch" : [
                {
                    "_id" : "alex",
                    "count" : 1
                },
                {
                    "_id" : "james",
                    "count" : 1
                } .......
            },
        "ok" : 1
    }

1 个答案:

答案 0 :(得分:3)

编辑:

来自MongoDB RunCommand Docs

  

使用aggregate命令返回游标是一种低级操作,适用于驱动程序的作者。大多数用户应该使用mongo shell或其驱动程序中提供的db.collection.aggregate()帮助程序。在2.6及更高版本中,aggregate()帮助程序始终返回游标。

您需要发送OP_GET_MORE消息来迭代光标。

而是使用aggregate() helper

var data= db.profiles.aggregate([
    {$limit: 100000},
        {$unwind: "$Items"},
        {   $group: {
                _id: "$Items", count: {$sum: 1}
            },
        },
    ],
    {
        allowDiskUse: true,
        cursor: { batchSize: 100}
    }
)

这会返回一个光标。您可以使用forEach方法进行迭代。

data.forEach(printjson)