如何使用webtask.io和mlab使用mongodb find()获取集合的所有文档

问题描述 投票:0回答:1

我在mlab.com的mongodb中有一个名为“posts”的集合,我正在尝试使用db.collection('posts').find()访问此集合中的所有文档。下面是我创建的webtask的代码,我将其命名为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 webtask并且运行完美。但是,对于我的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
}

有谁知道这个问题的解决方案?谢谢。

mongodb mlab serverless webtask faas
1个回答
1
投票

Collection.find返回cursor,而不是查询的结果。您可能想要在光标上链接所有操作,例如sortlimit,然后使用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));
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.