Как получить все документы коллекции с помощью mongodb find() с помощью webtask.io и mlab

У меня есть коллекция с именем "posts" в mongodb на mlab.com, и я пытаюсь получить доступ ко всем документам в этой коллекции с помощью db.collection('posts').find(), Ниже приведен мой код для моей веб-задачи, которую я назвал mongodb_find:

var MongoClient = require('mongodb').MongoClient;
var waterfall   = require('async').waterfall;

/**
 * @param {secret} MONGO_URL - Mongo database url
 */
module.exports = function(ctx, cb) {

    var MONGO_URL = ctx.data.MONGO_URL;
    if (!MONGO_URL) return cb(new Error('MONGO_URL secret is missing'))

    waterfall([
        function connect_to_db(done) {
            MongoClient.connect(MONGO_URL, function(err, db) {
                if(err) return done(err);
                done(null, db);
            });
        },

        function find_hits(db, done) {
            db
            .collection('posts')
            .find(
                {},
                function (err, result) {
                    if(err) return done( err );
                    done( null, JSON.stringify(result) );
                }
            ).sort({ hits: -1 }).limit( 2 );
        }

    ], cb);

};

у меня есть mongodb_upsert Веб-задача, которая очень похожа на это и работает отлично. Однако для моего mongodb_find задача я получаю следующую ошибку:

{
  "code": 400,
  "error": "Error when JSON serializing the result of the JavaScript code.",
  "details": "TypeError: Converting circular structure to JSON",
  "name": "TypeError",
  "message": "Converting circular structure to JSON",
  "stack": "TypeError: Converting circular structure to JSON\n    at Object.stringify (native)\n    at /data/sandbox/lib/sandbox.js:775:48\n    at /data/sandbox/node_modules/async/dist/async.js:473:16\n    at next (/data/sandbox/node_modules/async/dist/async.js:5315:29)\n    at /data/sandbox/node_modules/async/dist/async.js:958:16\n    at /data/io/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/webtask.js:27:6\n    at handleCallback (/data/_verquire/mongodb/2.0.48/node_modules/mongodb/lib/utils.js:96:12)\n    at Collection.find (/data/_verquire/mongodb/2.0.48/node_modules/mongodb/lib/collection.js:354:44)\n    at find_hits (/data/io/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/webtask.js:23:5)\n    at nextTask (/data/sandbox/node_modules/async/dist/async.js:5310:14)"
}

При подключении к mongodb из командной строки тоже самое find() Команда работает правильно:

db.posts.find({}).sort({hits: -1}).limit(2);

Документы в коллекции настроены так:

{
    "_id": {
        "$oid": "5a3ff239bda4eaa4ab96ef8b"
    },
    "title": "Testing 6",
    "url": "/jquery/2017/12/22/testing-6.html",
    "hits": 2
}

Кто-нибудь знает решение этой проблемы? Спасибо.

1 ответ

Решение

Collection.find возвращает курсор, а не результаты запроса. Вы, вероятно, хотите связать все свои операции, такие как sort а также limit на курсоре, затем используйте toArray определить обратный вызов. toArray получит результаты от курсора.

Например:

function find_hits(db, done) {
  db.collection('posts')
    .find({})
    .sort({ hits: -1 })
    .limit(2)
    .toArray(function (err, result) {
      if(err) return done( err );
      done(null, JSON.stringify(result));
    });
}
Другие вопросы по тегам