Node.js 获取MongoDb聚合上的错误
我一直在本地构建我的应用程序,使用最新的MongoDB 3.4,我的聚合调用工作正常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,似乎我的聚合函数无法在上面工
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中添加的
聚合阶段 作为MongoDB 3.2之前版本的采样解决方案,我建议在应用程序代码中使用NPM包。如果支持,这将使用$sample
,或者使用适用于较早版本MongoDB的算法$sample
- MongoDB 2.6中添加了基于光标的聚合
这由
错误指示。MongoDB 2.6+驱动程序默认使用游标来迭代大型结果集;旧版本仅限于内联结果(高达16MB)。您的Robomongo版本嵌入了比MongoDB 2.4更新的shell(您可以使用无法识别的字段“cursor”
)进行检查),并且似乎不支持使用version()
帮助程序进行2.4样式的聚合查询。可以通过aggregate()
而不是db.runCommand()
helper调用其他语法,但是升级到受支持的服务器版本将是更好的方法aggregate()
在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的详细解释和建议。