首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用webtask.io和mlab通过mongodb find()获取集合中的所有文档

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

Stack Overflow用户
提问于 2017-12-25 02:51:05
回答 1查看 1.6K关注 0票数 1

我在mlab.com的mongodb中有一个名为"posts“的集合,我正在尝试用db.collection('posts').find()访问这个集合中的所有文档。下面是我为for任务创建的代码,我将其命名为mongodb_find

代码语言:javascript
复制
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任务,我得到了以下错误:

代码语言:javascript
复制
{
  "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()命令可以正常工作:

代码语言:javascript
复制
db.posts.find({}).sort({hits: -1}).limit(2);

集合中的文档设置如下:

代码语言:javascript
复制
{
    "_id": {
        "$oid": "5a3ff239bda4eaa4ab96ef8b"
    },
    "title": "Testing 6",
    "url": "/jquery/2017/12/22/testing-6.html",
    "hits": 2
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-25 06:47:37

Collection.find返回一个cursor,而不是查询结果。您可能希望在游标上链接所有操作,如sortlimit,然后使用toArray定义回调。toArray将从游标中检索结果。

例如:

代码语言:javascript
复制
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));
    });
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47963251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档