Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 获取MongoDb聚合上的错误_Node.js_Mongodb_Raspberry Pi_Robo3t - Fatal编程技术网

Node.js 获取MongoDb聚合上的错误

Node.js 获取MongoDb聚合上的错误,node.js,mongodb,raspberry-pi,robo3t,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); }); }); 我现在已经将代码移到了raspberry pi,它仅限于MongoDB 2.4.10,似乎我的聚合函数无法在上面工

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

app.get('/random_menu', function (req, res) {
    Menus.aggregate([{$sample: {size: 1}}], function (err, data) {
        res.json(data);
    });
});
我现在已经将代码移到了raspberry 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的新手,因此非常感谢您的任何意见。

可从v3.2获得。

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

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

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

    作为MongoDB 3.2之前版本的采样解决方案,我建议在应用程序代码中使用NPM包。如果支持,这将使用
    $sample
    ,或者使用适用于较早版本MongoDB的算法

  • MongoDB 2.6中添加了基于光标的聚合

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

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


在MongoDB 3.4中,Raspberry Pi不是官方支持的平台。然而,也有其他人在这方面取得了成功。Raspberry Pi有限的硬件资源一般不适合重载,所以可以考虑使用PI来运行你的节点应用程序,但是连接到远程托管的数据库服务器。

谢谢亚历克斯,你知道我能用什么来获得相同的功能吗?但是如果您只需要一个集合中的随机文档,您可以
db.getCollection('menumes').find().skip(random_number).limit(1)
,其中random_number应该介于0和
db.getCollection('menumes').find().count()
感谢@Stennie的详细解释和建议。