标签: aggregation-framework

返回MongoDB中字段的实际类型

在MongoDB中,使用$type,可以根据字段是否与BSON数据类型匹配来过滤搜索(请参阅DOCS).

例如.

db.posts.find({date2: {$type: 9}}, {date2: 1})
Run Code Online (Sandbox Code Playgroud)

返回:

{ 
    "_id" : ObjectId("4c0ec11e8fd2e65c0b010000"), 
    "date2" : "Fri Jul 09 2010 08:25:26 GMT" 
}
Run Code Online (Sandbox Code Playgroud)

我需要一个查询,告诉我该字段的实际类型是什么,对于集合中的每个字段.这可能与MongoDB有关吗?

mongodb mongodb-query aggregation-framework

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

Mongo:计算一组文档中出现的单词数

我在Mongo有一套文件.说:

[
    { summary:"This is good" },
    { summary:"This is bad" },
    { summary:"Something that is neither good nor bad" }
]
Run Code Online (Sandbox Code Playgroud)

我想计算每个单词的出现次数(不区分大小写),然后按降序排序.结果应该是这样的:

[
    "is": 3,
    "bad": 2,
    "good": 2,
    "this": 2,
    "neither": 1,
    "nor": 1,
    "something": 1,
    "that": 1
]
Run Code Online (Sandbox Code Playgroud)

知道怎么做吗?聚合框架将是首选,因为我已经在某种程度上理解它:)

mongodb aggregation-framework

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

流星的平均聚合查询

好吧,仍然在我的玩具应用程序中,我想找出一组车主的里程表的平均里程数.这在客户端非常简单,但不能扩展.对?但是在服务器上,我并没有完全看到如何实现它.

问题:

  1. 你如何在服务器上实现某些东西然后在客户端上使用它?
  2. 如何使用mongo的$ avg聚合函数来利用其优化的聚合函数?
  3. 或者替代(2)如何在服务器上进行map/reduce并使其可供客户端使用?

@HubertOG的建议是使用Meteor.call,这是有意义的,我这样做:

# Client side
Template.mileage.average_miles = ->
  answer = null
  Meteor.call "average_mileage", (error, result) ->
    console.log "got average mileage result #{result}"
    answer = result
  console.log "but wait, answer = #{answer}"
  answer

# Server side
Meteor.methods average_mileage: ->
  console.log "server mileage called"
  total = count = 0
  r = Mileage.find({}).forEach (mileage) ->
    total += mileage.mileage
    count += 1
  console.log "server about to return #{total / count}"
  total / count
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,但它并不是因为尽可能接近Meteor.call是异步调用,并且answer将始终为null返回.处理服务器上的东西似乎是一个常见的用例,我必须忽略一些东西.那会是什么?

谢谢!

mongodb meteor aggregation-framework

15
推荐指数
1
解决办法
7115
查看次数

MongoDB聚合框架性能比数百万个文档慢

背景

我们的系统是运营商级并且非常强大,它经过负载测试以处理每秒5000个事务,并且对于每个事务,文档被插入到单个MongoDB集合中(在此应用程序中没有更新或查询,它是只写的).这相当于每天约700MM的文件,这是我们的基准.

MongoDB部署尚未分片,我们有1x replicaset,1个master和2个slave,所有这些都是ec2上的m2.2xlarge类型.每个实例都由1TB RAID0条带支持,该条带由8个卷组成(无PIOPS).我们使用带有c ++本机BSON解析器的nod​​e-mongodb-native驱动程序来获得最佳写入性能,并尝试相应地对文档结构建模.

注意

  • 文件很小(120字节)
  • 该文件包括"时间桶"(h [我们],d [ay],m [onth],y [ear])以及"t [ime]"字段
  • 我们在集合上有一个索引,用"c [ustomer]"和"a"查询,这是一个高度随机但非唯一的标签
  • 我们已经考虑将数据分区为单独的集合,但在此示例中,所有数据都很热.
  • 我们也在研究预聚合,尽管这不能实时完成.

需求

  • 对于报告,我们需要计算每月唯一"a"标记的数量,以及客户在任何给定时期内的总数
  • 报告需要大约60秒来运行2小时内存储的9.5MM文档的样本(完整集合).详情如下:

文献

{
  _id: ObjectID(),
  a: ‘string’,
  b: ‘string’,
  c: ‘string’ or <int>,
  g: ‘string’ or <not_exist>,
  t: ISODate(),
  h: <int>,
  d: <int>,
  m: <int>,
  y: <int>
}
Run Code Online (Sandbox Code Playgroud)

指数

col.ensureIndex({ c: 1, a: 1, y: 1, m: 1, d: 1, h: 1 });
Run Code Online (Sandbox Code Playgroud)

聚合查询

col.aggregate([
    { $match: { c: 'customer_1', y: 2013, m: 11 } },
    { $group: { _id: …
Run Code Online (Sandbox Code Playgroud)

indexing mapreduce mongodb aggregation-framework

15
推荐指数
2
解决办法
8055
查看次数

Mongodb聚合$ group,限制数组的长度

我想根据字段对所有文档进行分组,但是要限制为每个值分组的文档数.

每条消息都有一个conversation_ID.我需要为每个conversation_ID获取10或更少数量的消息.

我可以根据以下命令进行分组,但除了切片结果之外,无法弄清楚如何限制分组文档的数量 Message.aggregate({'$group':{_id:'$conversation_ID',msgs:{'$push':{msgid:'$_id'}}}})

如何将每个conversation_ID的msgs数组的长度限制为10?

database mongoose mongodb mongodb-query aggregation-framework

15
推荐指数
1
解决办法
6159
查看次数

MongoDB聚合框架$ group可以返回一组值吗?

MongoDB中输出格式的聚合函数有多灵活?

数据格式:

{
        "_id" : ObjectId("506ddd1900a47d802702a904"),
        "port_name" : "CL1-A",
        "metric" : "772.0",
        "port_number" : "0",
        "datetime" : ISODate("2012-10-03T14:03:00Z"),
        "array_serial" : "12345"
}
Run Code Online (Sandbox Code Playgroud)

现在我正在使用这个聚合函数来返回DateTime数组,一个指标数组和一个计数:

{$match : { 'array_serial' : array, 
                            'port_name' : { $in : ports},
                            'datetime' : { $gte : from, $lte : to}
                        }
                },
               {$project : { port_name : 1, metric : 1, datetime: 1}},
               {$group : { _id : "$port_name", 
                            datetime : { $push : "$datetime"},
                            metric : { $push : "$metric"},
                            count : { $sum : …
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

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

在mongodb聚合框架中执行case语句

我正在评估MongoDB聚合框架如何满足我们的需求,因为我们当前正在SQL Server上运行.我很难执行特定查询:

假设我有以下伪记录(在sql表中建模为列,在mongodb集合中建模为完整文档)

{
   name: 'A',
   timespent: 100,
},
{
   name: 'B',
   timespent: 200,
},
{
   name: 'C',
   timespent: 300,
},
{
   name: 'D',
   timespent: 400,
},
{
   name: 'E',
   timespent: 500,
}
Run Code Online (Sandbox Code Playgroud)

我想将timepent字段分组到范围并计算出现次数,以便我得到例如以下伪记录:

results{
   0-250: 2,
   250-450: 2,
   450-650: 1
}
Run Code Online (Sandbox Code Playgroud)

请注意,这些范围(250,450和650)是动态的,并且可能会被用户随时间改变.在SQL中,我们使用以下内容提取结果:

select range, COUNT(*) as total from (
select case when Timespent <= 250 then '0-250'
when Timespent <= 450 then '200-450'
else '450-600' end as range
from TestTable) as r
group by r.range
Run Code Online (Sandbox Code Playgroud)

再次注意,这个sql是由我们的应用程序动态构建的,以适应任何时候可用的特定范围.

我正在努力在mongodb聚合框架中找到适当的构造来执行此类查询.我可以通过在管道中插入$ match来查询单个范围的结果(即获取单个范围的结果),但我不知道如何在单个管道查询中提取所有范围及其计数.

mongodb aggregation-framework

14
推荐指数
2
解决办法
9825
查看次数

MongoDB $项目:保留以前的管道字段

在MongoDB投影中,有没有办法指定一些新字段(但同时保留输入到管道投影阶段的字段)?我没有重命名现有的任何字段.

因此,如果我从一个具有'field1'和'field2'的集合开始,并执行以下投影:

{ $project: { field3: { $gt: ['$field1', 10] } } }
Run Code Online (Sandbox Code Playgroud)

我想最终将'field1','field2'和'field3'作为输入提供给下一个阶段,或者从聚合框架输出.

我试图通过排除_id将投影置于排除模式,但这不起作用.

mongodb aggregation-framework

14
推荐指数
3
解决办法
7960
查看次数

获取MongoDB聚合$ group的百分比

我想从MongoDB聚合中的组管道中获取百分比.

我的数据:

{
    _id : 1,
    name : 'hello',
    type : 'big'
},
{
    _id : 2,
    name : 'bonjour',
    type : 'big'
},
{
    _id : 3,
    name : 'hi',
    type : 'short'
},
{
    _id : 4,
    name : 'salut',
    type : 'short'
},
{
    _id : 5,
    name : 'ola',
    type : 'short'
}
Run Code Online (Sandbox Code Playgroud)

我的请求组按类型和计数:

[{
    $group : {
        _id : {
            type : '$type'
        },
        "count" : {
            "$sum" : 1
        }
    }
}]
Run Code Online (Sandbox Code Playgroud)

结果:

[ …
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

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

聚合$ lookup匹配管道中文档的总大小超过最大文档大小

我有一个非常简单的$lookup聚合查询,如下所示:

{'$lookup':
 {'from': 'edge',
  'localField': 'gid',
  'foreignField': 'to',
  'as': 'from'}}
Run Code Online (Sandbox Code Playgroud)

当我在匹配足够的文档时运行它时,我收到以下错误:

Command failed with error 4568: 'Total size of documents in edge
matching { $match: { $and: [ { from: { $eq: "geneDatabase:hugo" }
}, {} ] } } exceeds maximum document size' on server
Run Code Online (Sandbox Code Playgroud)

所有限制文件数量的尝试都失败了.allowDiskUse: true什么也没做.发送输入cursor无效.添加$limit到聚合中也会失败.

怎么会这样?

然后我再次看到错误.哪里是$match$and$eq从何而来?幕后的聚合管道是否会$lookup调用另一个聚合,一个是自己运行的聚合管道,我无法为游标提供限制或使用游标.

这里发生了什么?

mongodb aggregation-framework

14
推荐指数
2
解决办法
8410
查看次数