MongoDB:无法从集合中返回随机文档

时间:2018-01-18 01:37:01

标签: mongodb function express random controller

我正在处理一个文字游戏,并试图在页面加载时返回一个随机 wordpair (我的收藏)。我使用了Express并根据this tutorial调整了我的代码(如果有的话)。

GET请求呈现我的页面很好,我试图在标题旁边发送一个随机的WordPair对象:

router.get('/', function(req, res, next) {
  res.render('play', { title: 'play', random_wordpair: wordpair_controller.wordpair_random});
});

wordpair_random函数位于我已经制作的控制器文件中(它也成功管理列出wordpairs并创建新的等等)。

// Get random WordPair
exports.wordpair_random = function() {
   WordPair.aggregate(
      [{
        $sample: {
          size: 1
        }
      }]
    )
    .exec(function(err, random_wordpair) {
      if (err) {
        return next(err);
      }
      console.log(random_wordpair);
      return random_wordpair;
    });
};

然后在play.pug模板中,我只是试图显示这个结果:

h3 random wordpair selection is: #{random_wordpair}

但我所能看到的是呈现为HTML文本的函数。谁能告诉我我做错了什么?

我也理解我需要在数据库对象上调用我的函数来查看MongoDB $sample aggregation的文档,但是我已经看过各种示例,有些人不这样做。在我的db.wordpair.aggregate(...)文件中初始化db后,我尝试直接调用app.js(或 WordPair wordpairs ,因为它出现在mLab中) ,我得到未定义的错误。我的db对象似乎不包含此请求的正确数据。

谢谢!

enter image description here

1 个答案:

答案 0 :(得分:1)

我想你是在Node.JS中写的。 Node.JS的核心功能是非阻塞IO模型。这意味着,代码不会等待数据库调用完成继续。

你需要做的另一个概念是Node.JS,它是JavaScript的一种变体,本质上是一种函数式编程。将函数分配给JSON对象的属性(如下所示)不会导致函数执行。它只是创建一个指向函数体的指针,这就是应用程序打印函数本身的原因。

{ title: 'play', random_wordpair: wordpair_controller.wordpair_random}

要解决此问题,请使用回调

exports.wordpair_random = function(callback) {
    WordPair.aggregate([$sample: {size: 1}}]).exec(callback);
};

然后在你的网络功能:

router.get('/', function(req, res, next) {
    wordpair_controller.wordpair_random(function(err, result) {
        //Handle errors if needed. 
        res.render('play', { title: 'play', random_wordpair:result });
    })
});