Как получить все документы коллекции с помощью 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));
});
}