标签: aggregation-framework

在JavaScript中将ObjectID(Mongodb)转换为String

我想在JavaScript中将ObjectID(Mongodb)转换为String.当我从一个对象形式MongoDB.它就像一个对象有:timestamp,second,inc,machine.我无法转换为字符串.

javascript mongodb aggregation-framework

48
推荐指数
10
解决办法
6万
查看次数

MongoDB {aggregation $ match} vs {find} speed

我有一个包含数百万行的mongoDB集合,我正在尝试优化我的查询.我目前正在使用聚合框架来检索数据并根据需要对它们进行分组.我的典型聚合查询类似于:$match > $group > $ group > $project

但是,我注意到最后的部分只花了几毫秒,开始是最慢的.

我尝试仅使用$ match过滤器执行查询,然后使用collection.find执行相同的查询.聚合查询需要大约80毫秒,而查询查询需要0或1毫秒.

我几乎每个字段都有索引,所以我想这不是问题.什么可能出错?或者它只是聚合框架的"正常"缺点?

我可以使用查找查询而不是聚合查询,但是我必须在请求之后执行大量处理,并且这个过程可以快速完成$group等等,所以我宁愿保留聚合框架.

谢谢,

编辑:

这是我的标准:

{
    "action" : "click",
    "timestamp" : {
            "$gt" : ISODate("2015-01-01T00:00:00Z"),
            "$lt" : ISODate("2015-02-011T00:00:00Z")
    },
    "itemId" : "5"
}
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

45
推荐指数
2
解决办法
2万
查看次数

使用聚合框架使用MongoDB进行组计数

假设我的MongoDB架构如下所示:

{car_id: "...", owner_id: "..."}
Run Code Online (Sandbox Code Playgroud)

这是一种多对多的关系.例如,数据可能如下所示:

+-----+----------+--------+
| _id | owner_id | car_id |
+-----+----------+--------+
|   1 |        1 |      1 |
|   2 |        1 |      2 |
|   3 |        1 |      3 |
|   4 |        2 |      1 |
|   5 |        2 |      2 |
|   6 |        3 |      4 |
|   7 |        3 |      5 |
|   8 |        3 |      6 |
|   9 |        3 |      7 |
|  10 …
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

43
推荐指数
1
解决办法
5万
查看次数

在MongoDb中按15分钟的时间间隔对结果进行分组

我有一个像这个结构的"状态"集合 -

{
    _id: ObjectId("545a0b63b03dbcd1238b4567"),
    status: 1004,
    comment: "Rem dolor ipsam placeat omnis non. Aspernatur nobis qui nisi similique.",
    created_at: ISODate("2014-11-05T11:34:59.804Z")
},
{
    _id: ObjectId("545a0b66b03dbcd1238b4568"),
    status: 1001,
    comment: "Sint et eos vero ipsa voluptatem harum. Hic unde voluptatibus et blanditiis quod modi.",
    created_at: ISODate("2014-11-05T11:35:02.814Z")
}
....
....
Run Code Online (Sandbox Code Playgroud)

我需要从该集合中获得15分钟间隔的结果.

mongodb mongodb-query aggregation-framework

41
推荐指数
5
解决办法
2万
查看次数

MongoDB按字段聚合存在

我很难相信这个问题还没有在某个地方被问过和回答,但是我找不到它的任何痕迹.

我有一个需要按布尔值分组的MongoDB聚合查询:是否存在另一个字段.

例如,让我们从这个集合开始:

> db.test.find()
{ "_id" : ObjectId("53fbede62827b89e4f86c12e"),
  "field" : ObjectId("53fbede62827b89e4f86c12d"), "name" : "Erik" }
{ "_id" : ObjectId("53fbee002827b89e4f86c12f"), "name" : "Erik" }
{ "_id" : ObjectId("53fbee092827b89e4f86c131"),
  "field" : ObjectId("53fbee092827b89e4f86c130"), "name" : "John" }
{ "_id" : ObjectId("53fbee122827b89e4f86c132"), "name" : "Ben" }
Run Code Online (Sandbox Code Playgroud)

2个文件有"字段",2个没有.注意,"field"的每个值可能不同; 我们只想对它的存在进行分组(或者非null也适用于我,我没有存储任何空值).

我已经尝试过使用$ project,但是$ exists不存在,$ cond和$ ifNull没有帮助我.该字段似乎总是存在,即使它不存在:

> db.test.aggregate(
  {$project:{fieldExists:{$cond:[{$eq:["$field", null]}, false, true]}}},
  {$group:{_id:"$fieldExists", count:{$sum:1}}}
)
{ "_id" : true, "count" : 4 }
Run Code Online (Sandbox Code Playgroud)

我希望以下更简单的聚合工作,但由于某种原因,$ exists不支持这种方式:

> db.test.aggregate({$group:{_id:{$exists:"$field"}, count:{$sum:1}}})
assert: command failed: {
  "errmsg" : "exception: invalid …
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

40
推荐指数
8
解决办法
4万
查看次数

MongoDB聚合比较:group(),$ group和MapReduce

关于何时使用group(),与$ group或mapreduce聚合,我有点困惑.我在http://www.mongodb.org/display/DOCS/Aggregation上阅读了针对group()的文档,http://docs.mongodb.org/manual/reference/aggregation/group/#_S_group for $ group ..分片是否group()不起作用的唯一情况?另外,我觉得$ group比group()更强大,因为它可以与聚合框架中的其他管道运算符一起使用.$ group如何与mapreduce进行比较?我在某处读到它不生成任何临时集合,而mapreduce则生成.是这样吗?
有人可以提供插图或指导我一起解释这三个概念的链接,采用相同的样本数据,以便我可以轻松地比较它们吗?

编辑:
此外,如果您可以在这些命令中指出任何新的东西,那将是很好的,因为新的2.2版本出来了..

mapreduce mongodb mongodb-query aggregation-framework

39
推荐指数
1
解决办法
1万
查看次数

在MongoDB中搜索多个集合

我知道MongoDB的理论以及不支持连接的事实,并且我应该尽可能地使用嵌入文档或非规范化,但是这里是:

我有多个文件,例如:

  • 用户,嵌入Suburbs,但也有:名字,姓氏
  • 郊区,嵌入国家
  • 嵌入学校的孩子属于用户,但也有:名字,姓氏

例:

Users:
{ _id: 1, first_name: 'Bill', last_name: 'Gates', suburb: 1 }
{ _id: 2, first_name: 'Steve', last_name: 'Jobs', suburb: 3 }

Suburb:
{ _id: 1, name: 'Suburb A', state: 1 }
{ _id: 2, name: 'Suburb B', state: 1 }
{ _id: 3, name: 'Suburb C', state: 3 }

State:
{ _id: 1, name: 'LA' }
{ _id: 3, name: 'NY' }

Child:
{ _id: 1, _user_id: 1, first_name: 'Little Billy', last_name: 'Gates' } …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

38
推荐指数
4
解决办法
5万
查看次数

MongoDB由数组内部元素组成

我有一个文章列表,每个文章都有一个数组属性,列出了其中提到的各个人:

_id: {
    $oid: "52b632a9e4f2ba13c82ccd23"
},
providerName: "The Guardian",
url: "http://feeds.theguardian.com/c/34708/f/663860/s/3516cebc/sc/38/l/0L0Stheguardian0N0Cmusic0C20A130Cdec0C220Cwaterboys0Efishermans0Eblues0Etour0Ehammersmith/story01.htm",
subject: "The Waterboys – review",
class_artist: [
    "paul mccartney"
]
Run Code Online (Sandbox Code Playgroud)

我一直在努力(不成功)class_artist根据他们在过去7天内被标记的文章数量来获取所有个体艺术家的列表().

我已经达到了:

var date = new Date();
date.setDate(date.getDate() - 7);

db.articles.group({
    key: { class_artist: 1 },
    cond: { class_date: { $gt: date } },
    reduce: function ( curr, result ) { result.cnt++; },
    initial: { cnt : 0 }
}).sort({cnt: -1});
Run Code Online (Sandbox Code Playgroud)

但不幸的是,它并不是基于单个数组值来计算它们,而是基于数组合成(即艺术家列表).

我尝试使用该$unwind功能,但无法使其工作.

mongodb mongodb-query aggregation-framework

38
推荐指数
1
解决办法
4万
查看次数

聚合框架中的$ skip和$ limit

当我阅读文档时,我发现了以下注释:

当$ sort紧接在管道中的$ limit之前时,$ sort操作仅保持前n个结果,其中n是指定的限制,而MongoDB只需要在内存中存储n个项目.当allowDiskUse为true且n个项超过聚合内存限制时,此优化仍适用.

如果我对此是正确的,它仅适用于我同时使用$ sort和$ limit的情况

db.coll.aggregate([
    ...,
    {$sort: ...},
    {$limit: limit},
    ...
]);
Run Code Online (Sandbox Code Playgroud)

但是,我想我们大部分时间都会这样做

db.coll.aggregate([
    ...,
    {$sort: ...},
    {$skip: skip},
    {$limit: limit},
    ...
]);
Run Code Online (Sandbox Code Playgroud)

问题1:如果我在这里使用$ skip,是否意味着上述规则不适用?

我问这个问题,因为理论上MongoDB仍然可以计算前n个记录,并通过只排序前n个记录来提高性能.我没有找到任何关于此的文件.如果规则不适用,

问题2:我是否需要将查询更改为以下内容以提高性能?

db.coll.aggregate([
    ...,
    {$sort: ...},
    {$limit: skip + limit},
    {$skip: skip},
    {$limit: limit},
    ...
]);
Run Code Online (Sandbox Code Playgroud)

编辑:我认为解释我的用例会使上面的问题更有意义.我正在使用MongoDB 2.6提供的文本搜索功能来查找产品.我担心如果用户输入一个非常常见的关键词,如"红色",将返回太多结果.因此,我正在寻找更好的方法来生成这个结果.

EDIT2:事实证明上面的最后一个代码等于

db.coll.aggregate([
    ...,
    {$sort: ...},
    {$limit: skip + limit},
    {$skip: skip},
    ...
]);
Run Code Online (Sandbox Code Playgroud)

因此,我总是可以使用此表单来应用前n个规则.

mongodb aggregation-framework

38
推荐指数
3
解决办法
3万
查看次数

MongoDB中的条件$ sum

我在mongodb中的集合类似于SQL中的下表:

情感(公司,感悟)

现在,我需要执行这样的查询:

SELECT
  Company, 
  SUM(CASE WHEN Sentiment >0 THEN Sentiment ELSE 0 END) AS SumPosSenti, 
  SUM(CASE WHEN Sentiment <0 THEN Sentiment ELSE 0 END) AS SumNegSenti
FROM Sentiments
GROUP BY Company
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能在Mongo中编写这个查询?我被困在以下查询中:

db.Sentiments.aggregate(
{ $project: {_id:0, Company:1, Sentiment: 1} },
{ $group: {_id: "$Company", SumPosSenti: {$sum: ? }, SumNegSenti: {$sum: ? } } }
);
Run Code Online (Sandbox Code Playgroud)

sql mongodb mongodb-query aggregation-framework

37
推荐指数
3
解决办法
3万
查看次数