相对简单的场景:
我有这个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?
我遇到了一些特殊用途的集合操作实现,但对于一般情况没有任何用处.执行集合运算的一般情况是什么(特别是交集,并集,对称差异).这更容易理解在$ where或map reduce中使用javascript,但我想知道如何在聚合中执行此操作以获得本机性能.
说明这个问题的更好方法是举个例子.假设我有2个阵列/集的记录:
db.colors.insert({
_id: 1,
left : ['red', 'green'],
right : ['green', 'blue']
});
Run Code Online (Sandbox Code Playgroud)
我想找到'左'和'右'数组的并集,交集和差异.更好的是,我想要找到:
联盟 - > ['红色','绿色','蓝色']

交叉口 - > ['绿色']

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

我使用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中有一系列文档(检查事件),如下所示:
{
"_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)
换句话说,我需要每天获得平均缺陷率.这可能吗?
我正在尝试使用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
在查看map-reduce的文档时,我发现:
注意:
对于大多数聚合操作,聚合管道提供更好的性能和更一致的接口.但是,map-reduce操作提供了一些在聚合管道中目前不可用的灵活性.
我对此并不了解.
标题说明了一切.如果文档根据其匹配字段不会导致任何匹配的外部文档,那么为什么它不包含在管道的结果集中呢?
我正在测试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)
因此,如果我有一个user空profile.universities数组,那么无论$lookup返回任何匹配项,我都需要将它包含在结果集中,但事实并非如此.我怎么能这样做,以及Mongo构建$lookup这种方式的原因是什么?
我有一个集合,称为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查询发现title与regex同时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) 我试图在一系列文档中总结一些值,没有运气.
这是文件
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) 我有一个集合名称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对两次.问题:如何在上述条件中从数组"数字"中选择不同的值?