在Mongo Shell中加载和运行聚合查询

7
我编写了一个在mongo shell中要运行的聚合操作。如果我直接将其粘贴到shell中,我必须逐行执行,这很繁琐和慢,特别是当它不能正常工作时,我必须重新执行。因此,我将其放在.js文档中,并像这样加载它 load("myaggregation.js") 但是,只有当代码有效时,它才返回true。加载后如何运行聚合操作?我找不到任何关于此的文档。我必须使用nodejs驱动程序吗?
4个回答

10
将您的聚合代码放入一个函数中:

将您的聚合代码放入一个函数中:

function my_aggregate() { 
    return db.foo.aggregate( [ ... ] );
}

将其存储在你的.js文件中。

然后运行load来加载它。您也可以使用--shell命令行标志在命令行上传递文件名,这将在运行任何指定的.js文件后启动交互式 shell。

运行该文件后,新的函数将可供执行。只需输入

my_aggregate()

更新,我之前没有提到,您需要使用显式的return。因此,在您的情况下,您需要像这样:

function my_aggregate() {
    return db.zips.aggregate([{ $match: { state: { $in: [ "CA", "NY" ] } }},{ $group:{ _id : {  "state" : "$state","city" : "$city" }, pop : { $sum: "$pop"}}},{ $match: {  pop: { $gt: 25000 } }},{$group:{ _id : {   "city" : "$city"}, pop : { $avg: "$pop"}}}]);
}

我有一个工作的聚合操作,我将其封装在函数my_aggregate(){}中,并存储在名为function.js的文件中。从mongo shell中,我执行了load("function.js"),它输出了true,然后我运行了my_aggregate(),但什么也没有发生。请问我的操作是否有误?如果您能澄清一下,我将不胜感激。 - BrainLikeADullPencil
你的函数对聚合结果做了什么处理?return值是什么? - friedo
看一下,我是否必须明确声明返回值?如果我在控制台中运行聚合“as is”(不使用函数),我不知道要声明返回值,但这样不同吗?http://pastebin.com/wWQHUbpW - BrainLikeADullPencil
@BrainLikeADullPencil 是的,在函数中你必须明确使用 return。在 shell 中输入时,表达式会在 REPL 中自动显示返回值。你的函数没有返回任何东西,因此它只被评估为一个表达式。请参考我的更新答案中的示例。 - friedo
@friedo 或许可以参考 load 函数?你的回答对我很有帮助,谢谢。但是仅从你的解释中还不够清晰如何使用 load - mffap

2

2
我知道我回答晚了,但我找到了一个不错的方法来处理这个问题:
创建一个包含您的聚合查询的js文件:
use blog; 

db.posts.aggregate([  
    ... my query ... 
]);

那么您可以简单地使用cat和管道将文件传输到mongo客户端:
cat myfile.js | mongo

1
aggrQuery = db.foo.aggregate([

    {$group: {_id: '$bar', pop: {$max: '$buz'}}}
])

在Mongo Shell中:
> load('/file/location/script.js');
true
>aggrQuery
here will be output

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接