标签: aggregation-framework

无法获得allowDiskUse:True可以与pymongo一起使用

我正在aggregation result exceeds maximum document size (16MB)使用pymongo进行mongodb聚合的错误.

我首先使用该limit()选项克服了它.但是,在某些时候我得到了

Exceeded memory limit for $group, but didn't allow external sort. Pass allowDiskUse:true to opt in." error.
Run Code Online (Sandbox Code Playgroud)

好的,我会用这个{'allowDiskUse':True}选项.当我在命令行上使用它时,此选项有效,但是当我尝试在我的python代码中使用它时

result = work1.aggregate(pipe, 'allowDiskUse:true')
Run Code Online (Sandbox Code Playgroud)

我收到TypeError: aggregate() takes exactly 2 arguments (3 given)错误.(尽管在http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate:aggregate(pipeline,** kwargs)中给出了定义.

我尝试使用runCommand,或者说它的pymongo等价:

db.command('aggregate','work1',pipe, {'allowDiskUse':True})
Run Code Online (Sandbox Code Playgroud)

但现在我回到'聚合结果超过最大文档大小(16MB)'错误

如果你需要知道

pipe = [{'$project': {'_id': 0, 'summary.trigrams': 1}}, {'$unwind': '$summary'}, {'$unwind': '$summary.trigrams'}, {'$group': {'count': {'$sum': 1}, '_id': '$summary.trigrams'}}, {'$sort': {'count': -1}}, {'$limit': 10000}]
Run Code Online (Sandbox Code Playgroud)

谢谢

mongodb pymongo aggregation-framework

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

在mongodb系列中找到最老/最年轻的帖子

我有一个mongodb有很多领域的集合.一个字段是'date_time',它是ISO日期时间格式,Ex:,ISODate("2014-06-11T19:16:46Z")另一个字段是'name'.

鉴于a name,如何找到该系列中最老/最年轻的帖子?

例如:如果two集合'数据'中有帖子:

[{'name' : 'John', 'date_time' : ISODate("2014-06-11T19:16:46Z")},
 {'name' : 'John', 'date_time' : ISODate("2015-06-11T19:16:46Z")}]
Run Code Online (Sandbox Code Playgroud)

鉴于"约翰"这个名字,我如何找到该系列中最老的帖子,即ISODate("2014-06-11T19:16:46Z")哪一个?同样对于最年轻的帖子.

datetime datetime-format mongodb aggregation-framework

16
推荐指数
2
解决办法
9445
查看次数

即使添加了唯一键,MongoDB也会复制文档

我创建了一个集合并添加了一个这样的唯一键

db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true,dropDups: true})
Run Code Online (Sandbox Code Playgroud)

该集合看起来像这样的"user_services"

{
 "_id" : ObjectId("55068b35f791c7f81000002d"),
 "uid" : 15,
 "sid" : 1,
 "rate" : 5
},
{

 "_id" : ObjectId("55068b35f791c7f81000002f"),
 "uid" : 15,
 "sid" : 1,
 "rate" : 4
}
Run Code Online (Sandbox Code Playgroud)

问题:

我使用php驱动程序插入具有相同的uid和sid的文档,它正在插入.

我想要的是

  1. 在Mongo Shell上:在uid和sid上添加唯一键,没有具有相同uid和sid的重复文档.
  2. 在PHP方面:有一些像mysql "插入(值)重复密钥更新率=率+ 1".这就是每当我尝试插入文档时,如果不存在,则应该插入文档,它应该更新文档的速率字段

php mongodb mongodb-query aggregation-framework

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

Spring Data MongoDB Lookup with Pipeline Aggregation

如何将以下 MongoDB 查询转换为 Java Spring 应用程序要使用的查询?我找不到使用pipeline提供的查找方法的方法。

这是我试图转换的查询。我还想指出,我没有使用,$unwind因为我希望将deliveryZipCodeTimings保留为返回对象中的分组集合。

db.getCollection('fulfillmentChannel').aggregate([
    {
        $match: {
            "dayOfWeek": "SOME_VARIABLE_STRING_1"
        }
    },
    {
        $lookup: {
            from: "deliveryZipCodeTiming",
            let: { location_id: "$fulfillmentLocationId" },
            pipeline: [{
                $match: {
                    $expr: {
                        $and: [
                            {$eq: ["$fulfillmentLocationId", "$$location_id"]},
                            {$eq: ["$zipCode", "SOME_VARIABLE_STRING_2"]}
                        ]
                    }
                }
            },
            { 
                $project: { _id: 0, zipCode: 1, cutoffTime: 1 } 
            }],
            as: "deliveryZipCodeTimings"
        }
    },
    {
        $match: {
            "deliveryZipCodeTimings": {$ne: []}
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

spring mongodb spring-data aggregation-framework spring-data-mongodb

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

MongoDB将来自两个字段的字符串连接到第三个字段

如何连接两个字段中的值并将其放入第三个字段中,值为字符串.我试过这个:

db.collection.update({"_id" : { $exists : true }},
                     {$set: {column_2:{$add:['$column_4',
                                             '$column_3']}}},
                     false, true)
Run Code Online (Sandbox Code Playgroud)

虽然似乎不起作用,但是抛出not ok for storage.我也试过这个:

db.collection.update({"_id" : { $exists : true }},
                     {$set: {column_2:{$add:['a',
                                             'b']}}},
                     false, true)
Run Code Online (Sandbox Code Playgroud)

但即使这显示同样的错误not ok for storage.

我想只在mongo服务器上连接而不是在我的应用程序中连接.

string-concatenation mongodb mongodb-query mongodb-update aggregation-framework

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

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万
查看次数

Mongo - 如何聚合,过滤和包含匹配文档中的数据数组?

我有一个mongo支持的联系人数据库,我试图以一堆不同的方式找到重复的条目.

例如,如果2个联系人具有相同的电话号码,则会将其标记为可能的副本,同样适用于电子邮件等.

我在Debian上使用MongoDB 2.4.2和pyMongo以及MongoEngine.

到目前为止,我最接近的是查找并计算包含相同电话号码的记录:

dbh.person_document.aggregate([
    {'$unwind': '$phones'},
    {'$group': {'_id': '$phones', 'count': {'$sum': 1}}},
    {'$sort': SON([('count', -1), ('_id', -1)])}
])

# Results in 
{u'ok': 1.0,
 u'result': [{u'_id': {u'number': u'404-231-4444', u'showroom_id': 5}, u'count': 5},
             {u'_id': {u'number': u'205-265-6666', u'showroom_id': 5}, u'count': 5},
             {u'_id': {u'number': u'213-785-7777', u'showroom_id': 5}, u'count': 4},
             {u'_id': {u'number': u'334-821-9999', u'showroom_id': 5}, u'count': 3}
]}
Run Code Online (Sandbox Code Playgroud)

所以我可以得到重复的数字,但我不能为我的生活弄清楚如何返回实际包含这些项目的文档数组!

我想看到每个数字的这种返回数据:

# The ObjectIDs of the documents that contained the duplicate phone numbers
{u'_id': {u'number': u'404-231-4444', u'showroom_id': 5}, 
  u'ids': [ObjectId('51c67e322b2192121ec4d8f2'), ObjectId('51c67e312b2192121ec4d8f0')], 
  u'count': 2},
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!

mongodb pymongo aggregation-framework

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

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聚合作业的进度

我使用Mongodb(2.6.0-rc2)聚合框架进行了长时间的工作:http://docs.mongodb.org/manual/core/aggregation-introduction/

我已经在javascript中编写了聚合并将作业作为脚本运行
(即mongo localhost:27017/test myjsfile.js).
启动脚本后,有什么方法可以查看作业的进度吗?

例如,使用示例聚合作业:

db.zipcodes.aggregate([
    {$group: {
        _id: "$state",
        totalPop: {$sum: "$pop"}
    }},
    {$match: {totalPop: {$gte: 10*1000*1000 }}}
])
Run Code Online (Sandbox Code Playgroud)

我希望看到这份工作目前正在执行一个小组,并且完成了70%.

对于mongo的map reduce作业,您可以查看progress via db.currentOp(),其中有一个progress字段,显示完成的作业的百分比,如本文所述:

是否有可能在mongo中获取地图减少进度通知?

聚合有什么相似之处吗?

mongodb aggregation-framework

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

MongoDB列表 - 获取每个第N项

我有一个看起来大致如下的Mongodb架构:

[
  {
    "name" : "name1",
    "instances" : [ 
      {
        "value" : 1,
        "date" : ISODate("2015-03-04T00:00:00.000Z")            
      }, 
      {
        "value" : 2,
        "date" : ISODate("2015-04-01T00:00:00.000Z")
      }, 
      {
        "value" : 2.5,
        "date" : ISODate("2015-03-05T00:00:00.000Z")
      },
      ...
    ]
  },
  {
    "name" : "name2",
    "instances" : [ 
      ...
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

其中每个元素的实例数量可能非常大.

我有时想只得到一个数据样本,也就是说,获取每个第三个实例,或每第10个实例......你得到了图片.

我可以通过获取所有实例并在我的服务器代码中过滤它们来实现这一目标,但我想知道是否有办法通过使用一些聚合查询来实现.

有任何想法吗?


更新

假设数据结构是扁平的,如下面的@SylvainLeroux所示,那就是:

[
  {"name": "name1", "value": 1, "date": ISODate("2015-03-04T00:00:00.000Z")},
  {"name": "name2", "value": 5, "date": ISODate("2015-04-04T00:00:00.000Z")},
  {"name": "name1", "value": 2, "date": ISODate("2015-04-01T00:00:00.000Z")},
  {"name": "name1", "value": 2.5, "date": ISODate("2015-03-05T00:00:00.000Z")},
  ...
] …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

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