在MongoDb聚合上出错

我一直在本地build立我的应用程序,所有工作正常,它使用最新的MongoDB 3.4和我的聚合调用工作正常。

app.get('/random_menu', function (req, res) { Menus.aggregate([{$sample: {size: 1}}], function (err, data) { res.json(data); }); }); 

我现在已经把我的代码移动到了我的树莓派,它仅限于MongoDB 2.4.10,看起来我的聚合函数不能工作。 我的应用程序不返回任何数据,并没有任何错误。

为了testing,我通过RoboMongo尝试了下面这个,它在当地的3.4版本上工作正常:

 db.getCollection('menus').aggregate([{$sample: {size: 1}}]) 

但是,当我尝试通过RoboMongo pi分贝,我得到以下错误:

 assert: command failed: { "errmsg" : "Pipeline::parseCommand(): unrecognized field \"cursor", "ok" : 0 } : aggregate failed _getErrorWithCode@src/mongo/shell/utils.js:23:13 doassert@src/mongo/shell/assert.js:13:14 assert.commandWorked@src/mongo/shell/assert.js:266:5 DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1215:5 @(shell):1:1 Error: command failed: { "errmsg" : "Pipeline::parseCommand(): unrecognized field \"cursor", "ok" : 0 } : aggregate failed : _getErrorWithCode@src/mongo/shell/utils.js:23:13 doassert@src/mongo/shell/assert.js:13:14 assert.commandWorked@src/mongo/shell/assert.js:266:5 DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1215:5 @(shell):1:1 

我试图用Googlesearch,似乎无法find任何东西。 我相当新的MongoDB,所以任何input将不胜感激。

MongoDB 2.4于2013年3月首次发布,并于2016年3月到期(在MongoDB 3.4.0发布前六个月)。 对新版本进行testing可能会导致意外使用向后不兼容的function或API。 除了丢失的function,报废的服务器版本可能会丢失重要的错误修复和安全性改进,将不再针对当前的驱动程序版本进行testing。

您的问题突出显示了MongoDB 2.4中不存在的两个function的问题:

  • MongoDB 3.2中添加的$sample聚合阶段。

    作为使用MongoDB 3.2以前版本进行采样的解决方法,我build议在您的应用程序代码中使用NPM软件包mongodb-collection-sample 。 如果支持,则使用$sample ;对于较早版本的MongoDB,则使用油藏采样algorithm。

  • 基于游标的聚合,这是在MongoDB 2.6中添加的。

    这是由unrecognized field "cursor"错误指示的。 MongoDB 2.6+驱动程序默认使用游标来迭代大型结果集; 较旧版本仅限于内联结果(最多16MB)。 你的Robomongo版本embedded了一个比MongoDB 2.4更新的shell(你可以用version()来检查这个version() ),并且不支持使用aggregate()助手的2.4样式的聚合查询。 还有另一种语法可以通过db.runCommand()而不是aggregate()帮助aggregate()来调用aggregate ,但是升级到受支持的服务器版本将是更好的方法。

如果您是MongoDB的新手,我肯定会鼓励使用受支持的版本(截至2017年3月的MongoDB 3.0或更高版本),并尽可能在您的开发和部署环境中使用相同的主要版本。

在MongoDB 3.4上,Raspberry Pi并不是官方支持的平台。 但是, ArchLinux ARM的社区包也是其他人都成功的。 Raspberry Pi有限的硬件资源通常不适用于繁重的工作,因此可以考虑使用Pi来运行Node应用程序,但要连接到远程托pipe的数据库服务器。

$ sample可从v3.2获得。