7

我已经编写了一个聚合,我想在 mongo shell 中的一个集合上运行。如果我直接将它粘贴到外壳中,我必须逐行执行,这既繁琐又缓慢,尤其是当它不起作用并且我必须重新执行时。因此,我将它放在一个 .js 文档中并像这样加载它,但只有在代码有效load("myaggregation.js")时才会返回。true加载后如何运行聚合?我找不到任何关于此的文档。我必须使用 nodejs 驱动程序吗?

4

4 回答 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"}}}]);
}
于 2013-09-15T05:05:23.163 回答
2

你看过http://docs.mongodb.org/manual/tutorial/write-scripts-for-the-mongo-shell/吗?

像:mongo localhost:27017/test myjsfile.js

它还说“您可以使用 load() 函数从 mongo shell 中执行 .js 文件”。

于 2013-09-15T01:17:13.937 回答
2

我知道这是一个迟到的答案,但我找到了一个很好的方法来处理这个问题:

创建一个包含您的聚合查询的 js 文件:

use blog; 

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

然后你可以简单地 cat 并将文件传递给 mongo 客户端:

cat myfile.js | mongo
于 2014-07-23T06:52:26.367 回答
1

script.js 文件内容:

aggrQuery = db.foo.aggregate([

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

在 mongo 外壳中:

> load('/file/location/script.js');
true
>aggrQuery
here will be output
于 2014-11-18T05:15:22.207 回答