首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MongoDb聚合上获取错误

问在MongoDb聚合上获取错误
EN

Stack Overflow用户
提问于 2017-03-25 22:56:45
回答 2查看 1.9K关注 0票数 1

我一直在本地构建我的应用程序,所有的工作都很好,它使用了最新的MongoDB 3.4,我的聚合调用也很好。

代码语言:javascript
复制
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版本上运行得很好:

代码语言:javascript
复制
db.getCollection('menus').aggregate([{$sample: {size: 1}}])

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

代码语言:javascript
复制
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的新手,所以任何输入都会非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-26 01:13:39

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

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

  • $sample聚合阶段,在MongoDB 3.2中添加。 我建议在应用程序代码中使用NPM包mongodb-collection-sample,作为对预3.2版本MongoDB进行抽样的一种解决办法。这将使用$sample (如果支持的话),或者对较早版本的MongoDB使用储层取样算法。
  • 基于游标的聚合,在MongoDB 2.6中添加. 这是由unrecognized field "cursor"错误指示的。MongoDB 2.6+驱动程序默认使用游标来迭代大型结果集;旧版本仅限于内联结果(最多16 up)。您的Robomongo版本嵌入了比MongoDB 2.4更新的shell (您可以使用version()检查),并且似乎不支持aggregate()助手提供的2.4风格的聚合查询。可以通过db.runCommand()而不是aggregate()助手调用aggregate(),但是升级到受支持的服务器版本将是一种更好的方法。

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

与MongoDB 3.4一样,Raspberry并不是官方支持的平台。然而,有一些其他人已经成功地使用了用于ArchLinux ARM的社区包。Raspberry Pi有限的硬件资源通常不适合进行大量繁重的工作,因此需要考虑的另一种方法是使用Pi运行Node应用程序,但连接到远程托管的数据库服务器。

票数 2
EN

Stack Overflow用户

发布于 2017-03-25 23:11:21

$sample可从v3.2中获得。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43022914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档