我一直在本地构建我的应用程序,所有工作正常,使用最新的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的新手,所以任何意见都会非常感激。
答案 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应用程序但连接到远程托管的数据库服务器。