【问题标题】:Getting error on MongoDb aggregate在 MongoDb 聚合上出现错误
【发布时间】:2017-08-18 18:34:29
【问题描述】:

我一直在本地构建我的应用程序,一切正常,它使用最新的 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 的树莓派上,我的聚合函数似乎无法在它上面运行。我的应用没有返回任何数据,也没有错误。

为了测试,我通过 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 比较陌生,因此非常感谢任何输入。

【问题讨论】:

    标签: node.js mongodb raspberry-pi robo3t


    【解决方案1】:

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

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

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

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

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

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

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

    在 MongoDB 3.4 中,Raspberry Pi 不是官方支持的平台。但是,其他人已经成功使用了community packages for ArchLinux ARM。 Raspberry Pi 有限的硬件资源通常不适合繁重的工作,因此可以考虑使用 Pi 来运行您的 Node 应用程序,但连接到远程托管的数据库服务器。

    【讨论】:

    • 感谢@Stennie 的详尽解释和建议。
    【解决方案2】:

    $sample 从 v3.2 开始可用。

    【讨论】:

    • 谢谢亚历克斯,你知道我可以用什么替代方法来获得相同的功能吗?
    • 否,但如果您只需要集合中的随机文档,您可以db.getCollection('menus').find().skip(random_number).limit(1),其中 random_number 应介于 0 和 db.getCollection('menus').find().count()
    猜你喜欢
    • 2018-06-07
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    相关资源
    最近更新 更多