标签: aggregation-framework

无法使用$ match运算符与ObjectId进行mongodb/mongoose聚合

相对简单的场景:

我有这个Voucher具有user属性(类型ObjectId)的对象.我想获得单个用户的所有凭证值的总和.这是我当前的策略,它返回一个空数组:

Voucher.aggregate [
    { $match : { user : new ObjectId(user_id), expires : { $gt : new Date() } } }
    { $group : { _id : null, sum : { $sum : '$value' } } }
], (err, result)->

    console.log err
    console.log result
Run Code Online (Sandbox Code Playgroud)

删除userid 的匹配项并离开该expires字段将返回结果.那么问题就变成了比赛的错误user

mongoose mongodb aggregation-framework

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

如何将MongoDB聚合用于通用集合操作(​​并集,交集,差异)

我遇到了一些特殊用途的集合操作实现,但对于一般情况没有任何用处.执行集合运算的一般情况是什么(特别是交集,并集,对称差异).这更容易理解在$ where或map reduce中使用javascript,但我想知道如何在聚合中执行此操作以获得本机性能.

说明这个问题的更好方法是举个例子.假设我有2个阵列/集的记录:

db.colors.insert({
    _id: 1,
    left : ['red', 'green'],
    right : ['green', 'blue']
});
Run Code Online (Sandbox Code Playgroud)

我想找到'左'和'右'数组的并集,交集和差异.更好的是,我想要找到:

联盟 - > ['红色','绿色','蓝色']

联盟

交叉口 - > ['绿色']

在此输入图像描述

对称差异 - > ['red','blue']

在此输入图像描述

set mongodb set-intersection aggregation-framework

11
推荐指数
1
解决办法
3578
查看次数

mongo聚合结果超过最大文档大小

我使用mongo聚合函数来查找集合中的重复文档,其中集合如下所示:

{_id, placement_id, placement_name, program_id, target}
Run Code Online (Sandbox Code Playgroud)

我需要找到除_id和placement_id之外具有完全相同字段的所有文档,因此这两个文档是相同的:

{_id:3, placement_id:23, placement_name:"pl1", program_id:5, target:"-"}
{_id:7, placement_id:55, placement_name:"pl1", program_id:5, target:"-"}
Run Code Online (Sandbox Code Playgroud)

我想出的集合函数是:

db.placements.aggregate({$group:{_id:{placement_name:"$placement_name", program_id:"$program_id", target:"$target"}, total:{$sum:1}}},{$match:{total:{$gte:2}}});
Run Code Online (Sandbox Code Playgroud)

然后mongo刚回来:

Error: Printing Stack Trace
    at printStackTrace (src/mongo/shell/utils.js:37:15)
    at DBCollection.aggregate (src/mongo/shell/collection.js:897:9)
    at (shell):1:15
Wed Apr  2 07:43:23.090 aggregate failed: {
    "errmsg" : "exception: aggregation result exceeds maximum document size (16MB)",
    "code" : 16389,
    "ok" : 0
} at src/mongo/shell/collection.js:898
Run Code Online (Sandbox Code Playgroud)

聚合是正确的,我在较小的集合上测试它并且它工作正常,但生产集合有大约80M文档.我想知道在80M文档上尝试find()函数时,它可以工作并要求你输入'it'来获取更多记录.为什么聚合函数没有这个功能呢?我还尝试将limit()附加到聚合函数的末尾,但它也不起作用.有什么工作吗?谢谢.

mongodb aggregation-framework

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

MongoDB中的条件分组

我在MongoDB中有一系列文档(检查事件),如下所示:

{
    "_id" : ObjectId("5397a78ab87523acb46f56"),
    "inspector_id" : ObjectId("5397997a02b8751dc5a5e8b1"),
    "status" : 'defect',
    "utc_timestamp" : ISODate("2014-06-11T00:49:14.109Z")
}

{
    "_id" : ObjectId("5397a78ab87523acb46f57"),
    "inspector_id" : ObjectId("5397997a02b8751dc5a5e8b2"),
    "status" : 'ok',
    "utc_timestamp" : ISODate("2014-06-11T00:49:14.109Z")
}
Run Code Online (Sandbox Code Playgroud)

我需要得到一个如下所示的结果集:

[
  {
    "date" : "2014-06-11",
    "defect_rate" : '.92' 
  },  
  {
    "date" : "2014-06-11",
    "defect_rate" : '.84' 
  }, 
]
Run Code Online (Sandbox Code Playgroud)

换句话说,我需要每天获得平均缺陷率.这可能吗?

mongodb mongodb-query aggregation-framework

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

Flask-MongoEngine和PyMongo聚合查询

我正在尝试使用flask-mongoengine进行聚合查询,从我所看到的内容听起来并不可能.

我查看了几个论坛主题,电子邮件链和Stack Overflow上的一些问题,但我还没有找到一个如何用flask-mongoengine实现聚合的一个很好的例子.

这个问题中有一条评论说你必须使用"原始pymongo和聚合功能".但是,没有关于如何工作的例子.我已经修改了Python并使用Flask框架进行了基本的应用程序,但是深入研究完整的应用程序以及连接/查询Mongo对我来说是一个新手.

有人可以提供一个示例(或示例的链接),我可以如何利用我的flask-mongoengine模型,但是使用PyMongo的聚合框架进行查询?这需要两个连接到MongoDB(一个用于PyMongo执行聚合查询,另一个用于通过MongoEngine进行常规查询/插入/更新)?

我想要执行的聚合查询的示例如下(此查询获取了我在Mongo shell中所需的信息):

db.entry.aggregate([
    { '$group' : 
        { '_id' : { 'carrier' : '$carrierA', 'category' : '$category' }, 
          'count' : { '$sum' : 1 }
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

此查询的输出示例:

{ "_id" : { "carrier" : "Carrier 1", "category" : "XYZ" }, "count" : 2 }
{ "_id" : { "carrier" : "Carrier 1", "category" : "ABC" }, "count" : 4 }
{ "_id" : { "carrier" : "Carrier 2", "category" : "XYZ" }, "count" : …
Run Code Online (Sandbox Code Playgroud)

python mongodb pymongo aggregation-framework flask-mongoengine

11
推荐指数
2
解决办法
5029
查看次数

何时在MongoDB中使用map reduce over Aggregation Pipeline?

在查看map-reduce的文档时,我发现:

注意:

对于大多数聚合操作,聚合管道提供更好的性能和更一致的接口.但是,map-reduce操作提供了一些在聚合管道中目前不可用的灵活性.

我对此并不了解.

  • 使用map-reduce over aggregation管道的用例有哪些?
  • map-reduce提供了哪些灵活性?
  • 表现有多少三角洲?

mapreduce mongodb aggregation-framework

11
推荐指数
1
解决办法
4668
查看次数

如果Mongo $ lookup是左外连接,那怎么会排除不匹配的文档呢?

标题说明了一切.如果文档根据其匹配字段不会导致任何匹配的外部文档,那么为什么它不包含在管道的结果集中呢?

我正在测试Mongo 3.2中的新聚合器,我已经通过首先展开来执行嵌套数组查找,然后将文档分组备份.我剩下的就是让结果包括所有不符合$lookup标准的本地文档,这就是我认为的"左外连接"的标准定义.

这是查询:

db.users.aggregate([
    {
        $unwind: "$profile",
        $unwind: "$profile.universities"
    },
    {
        $lookup: {
            from: "universities",
            localField: "profile.universities._id",
            foreignField: "_id",
            as: "profile.universities"
        }
    },
    {
        $group: {
            _id: "$_id",
            universities: {
                $addToSet: "$profile.universities"
            }
        }
    }
]).pretty()
Run Code Online (Sandbox Code Playgroud)

因此,如果我有一个userprofile.universities数组,那么无论$lookup返回任何匹配项,我都需要将它包含在结果集中,但事实并非如此.我怎么能这样做,以及Mongo构建$lookup这种方式的原因是什么?

lookup mongodb aggregation-framework

11
推荐指数
1
解决办法
9799
查看次数

具有条件的Mongodb聚合查找

我有一个集合,称为article_category哪个商店都article_id属于category_id具有数据格式的类别.

集合1:article_category

{
  "article_id": 2015110920343902,
  "all_category_id": [5,8,10]
}
Run Code Online (Sandbox Code Playgroud)

然后我有其他收集称为article哪个存储我的所有帖子

收集2:文章

{
  "title": "This is example rows in article collection"
  "article_id": 2015110920343902,
},
{
  "title": "Something change"
  "article_id": 2015110920343903,
},
{
  "title": "This is another rows",
  "article_id": 2015110920343904,
}
Run Code Online (Sandbox Code Playgroud)

现在,我想执行的MongoDB查询发现titleregex同时category_id必须等于8.这是我的查询,但不起作用.

db.article.aggregate(
{
  $match: 
  {
    title: 
    {
       $regex: /example/
    }
  }
},
{
    $lookup:
       {
         from: "article_category",
         pipeline: [
            { $match: { category_id: 8 } } …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

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

在嵌套文档MongoDB中求和

我试图在一系列文档中总结一些值,没有运气.

这是文件

db.Cuentas.find().漂亮的()

{
    "Agno": "2013",
    "Egresos": [
        {
            "Fecha": "28-01-2013",
            "Monto": 150000,
            "Detalle": "Pago Nokia Lumia a @josellop"
        },
        {
            "Fecha": "29-01-2013",
            "Monto": 4000,
            "Detalle": "Cine, Pelicula fome"
        }
    ],
    "Ingresos": [],
    "Mes": "Enero",
    "Monto": 450000,
    "Usuario": "MarioCares"
    "_id": ObjectId(....)
}
Run Code Online (Sandbox Code Playgroud)

因此,我需要"Eguos"中所有"Monto"的总和为"Usuario":"MarioCares".在这个例子154000

使用聚合我使用:

db.Cuentas.aggregate(
    [
        { $match: {"Usuario": "MarioCares"} },
        { $group: 
            {
                _id: null,
                "suma": { $sum: "$Egresos.Monto" }
            }
        }
    ]
)
Run Code Online (Sandbox Code Playgroud)

但我总是得到

{ "result" : [{ "_id" : null, "suma" : 0 }], …
Run Code Online (Sandbox Code Playgroud)

sum mongodb aggregation-framework

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

从MongoDB中的Array中选择Distinct值

我有一个集合名称Alpha_Num,它有以下结构.我想找出哪个Alphabet-Numerals对会出现最大次数?

如果我们只使用下面的数据,对abcd-123出现两次,因为对efgh-10001,但第二个不是我的有效案例,因为它出现在同一文件中.

{
    "_id" : 12345,
    "Alphabet" : "abcd",
        "Numerals" : [
            "123",
            "456",
            "2345"
        ]
}
{
    "_id" : 123456,
    "Alphabet" : "efgh",
    "Numerals" : [
            "10001",
            "10001",
            "1002"
        ]
}

{
    "_id" : 123456567,
    "Alphabet" : "abcd",
        "Numerals" : [
            "123"
        ]
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用聚合框架工作,如下所示

db.Alpha_Num.aggregate([
                     {"$unwind":"$Numerals"},
                     {"$group":
                              {"_id":{"Alpha":"$Alphabet","Num":"$Numerals"},
                               "count":{$sum:1}}
                     },
                     {"$sort":{"count":-1}}
                     ])
Run Code Online (Sandbox Code Playgroud)

这个查询中的问题是它给efgh-10001对两次.问题:如何在上述条件中从数组"数字"中选择不同的值?

mongodb aggregation-framework

10
推荐指数
1
解决办法
9408
查看次数