Как сделать пейджинг в Mongodb с помощью курсора node-mongodb-native? - PullRequest
0 голосов
/ 19 августа 2011

Я работаю над REST API, мне нужно иметь возможность просматривать страницы через MongoDB, насколько я понимаю, курсор - лучший способ сделать это. Я могу получить курсор, но как его сериализовать, чтобы отправить его клиенту? и как сервер десериализовал бы это, когда это возвращается, и запрос с этим? Это вообще возможно?

 collection.find({}, function(err, cursor) { 
                        if (err) { console.log("Error in find: " + err); return;} 
                        cursor.each(function(err, item) { 
                                if (err) { throw err;
                                }
                                if (!item) { 
                                        console.log("All done"); 
                                } else { 
                                        console.log(sys.inspect(item)); 
                                } 
                        }); 
                });

С уважением,

1 Ответ

2 голосов
/ 20 августа 2011

Привет, я увидел ваш вопрос в списке рассылки node-mongodb-native . Я знаю, что вы можете сериализировать курсоры запросов в App Engine , но я не думаю, что вы можете сделать точный аналог в MongoDb. В Bigtable курсор, который получает клиент, является фактическим ключом последней строки, которая была отсканирована, тогда как в MongoDb курсор клиента является только 64-разрядным числом. Судя по документации MongoDb о тайм-аутах курсоров , на самом деле не рекомендуется держать курсоры отдельно для каждого пользователя, поскольку каждый выдающийся курсор занимает память базы данных.

Но если по какой-то причине вы все еще хотите использовать курсоры MongoDb, я думаю, что можно взломать cursor.js , но я не пробовал сам. Для клиента курсор - это не что иное, как 64-битный cursorId, и вы должны иметь возможность создать новый курсор для выдачи правильных запросов OP_GETMORE на сервер . Я думаю, что это будет выглядеть примерно так (не проверено!):

var cursorId = cursor.cursorId;

// ...
var cursor2 = new mongodb.Cursor(db, collection).limit(100);
cursor2.state = mongodb.Cursor.OPEN;
cursor2.cursorId = cursorId;
cursor2.toArray(function(err, results) {console.log(results);});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...