在MongoDb聚合上获取错误

时间:2017-03-25 22:56:45

标签: node.js mongodb raspberry-pi robo3t

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

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

我现在已经将我的代码移到了我的覆盆子pi,仅限于MongoDB 2.4.10,似乎我的聚合函数不适用于它。我的应用程序不会返回任何数据,也没有错误。

要测试我是通过RoboMongo尝试过的,具有以下功能,在本地3.4版本上运行正常:

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

但是当我通过RoboMongo在pi db上尝试时,我收到以下错误:

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

我试过谷歌搜索,似乎找不到任何东西。我是MongoDB的新手,所以任何意见都会非常感激。

2 个答案:

答案 0 :(得分:1)

$sample可从v3.2获得。

答案 1 :(得分:1)

MongoDB 2.4于2013年3月首次发布,并于2016年3月达到使用寿命(MongoDB 3.4.0可用前六个月)。针对较新版本进行测试可能会导致意外使用向后兼容的功能或API。除了缺少功能之外,生命周期结束服务器版本可能缺少重要的错误修复和安全性改进,并且将不再针对当前的驱动程序版本进行测试。

您的问题突出了MongoDB 2.4中不存在的两个功能的问题:

  • $sample聚合阶段,已在MongoDB 3.2中添加。

    作为使用3.2之前版本的MongoDB进行采样的解决方法,我建议在应用程序代码中使用NPM包mongodb-collection-sample。如果支持,则使用$sample或使用旧版MongoDB的reservoir sampling算法。

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

    这由unrecognized field "cursor"错误表示。 MongoDB 2.6+驱动程序默认使用游标来迭代大型结果集;旧版本仅限于内联结果(最多16MB)。您的Robomongo版本嵌入了比MongoDB 2.4更新的shell(您可以使用version()进行检查)并且似乎不支持使用aggregate()帮助程序的2.4样式聚合查询。可以通过db.runCommand()而不是aggregate()帮助程序调用{​​{3}}的替代语法,但升级到支持的服务器版本将是更好的方法。

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

与MongoDB 3.4一样,Raspberry Pi不是官方支持的平台。但是,有aggregate其他人取得了成功。 Raspberry Pi的有限硬件资源通常不适合繁重的工作,因此可以考虑使用Pi来运行Node应用程序但连接到远程托管的数据库服务器。