标签: aggregation-framework

使用MongoDB聚合框架获取数组大小直方图的最快方法

我正在尝试获取具有不同大小的数组的记录数列表.我想得到所有记录的数组大小的分布,所以我可以建立这样的直方图:

          | *
          | *
documents | *         *
          | *  *      *
          |_*__*__*___*__*___
            2  5  6  23  47

               Array Size
Run Code Online (Sandbox Code Playgroud)

所以原始文档看起来像这样:

{hubs : [{stuff:0, id:6}, {stuff:1"}, .... ]}
{hubs : [{stuff:0, id:6}]}`
Run Code Online (Sandbox Code Playgroud)

到目前为止,使用聚合框架和一些帮助,在这里我想出来的

db.sitedata.aggregate([{ $unwind:'$hubs'}, 
                       { $group : {_id:'$_id', count:{$sum:1}}}, 
                       { $group : {_id:'$count', count:{$sum:1}}},
                       { $sort  : {_id: 1}}])
Run Code Online (Sandbox Code Playgroud)

这似乎给了我想要的结果,但它不是很快.我想知道我是否可以做这样的事情,可能不需要两个组呼.这里的语法是错误的,但我想要做的是将计数值放在第一个_id字段中:

db.sitedata.aggregate([{ $unwind:'$hubs'}, 
                       { $group : {_id:{$count:$hubs}, count:1}},
                       { $sort  : { _id: 1 }}])
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

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

mongodb聚合框架由嵌套文档匹配

我有以下文件清单:

{
    "_id" : "Tvq579754r",
    "name": "Tom",
    "forms": {
           "PreOp":{
             "status":"closed"          
           },

           "Alert":{
             "status":"closed"          
           },

           "City":{
              "status":"closed"         
           },

          "Country":{
             "status":"closed"          
          } 
    }
},
....
{
    "_id" : "Tvq444454j",
    "name": "Jim",
    "forms": {
          "Jorney":{
             "status":"closed"          
           },

          "Women":{
             "status":"void"            
          },

         "Child":{
            "status":"closed"           
         },

         "Farm":{
           "status":"closed"            
         }  
     }
}
Run Code Online (Sandbox Code Playgroud)

我想通过'status'字段('forms.name_of_form.status')过滤它们.我需要获取所有没有'forms.name_of_form.status'等于'void'的文档.

预期结果是(没有无效表格状态的文件):

{
    "_id" : "Tvq579754r",
    "name": "Tom",
    "forms": {
           "PreOp":{
             "status":"closed"          
           },

           "Alert":{
             "status":"closed"          
           },

           "City":{
              "status":"closed"         
           },

          "Country":{
             "status":"closed"          
          } 
    }
}
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

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

使用$ slice运算符获取mongodb中数组的最后一个元素

如何使用mongodb中的条件获取数组的最后一个元素.我无法使用切片.这是我的代码

{ "1" : { "relevancy" : [  "Y" ] }, "_id" : ObjectId("530824b95f44eac1068b45c0") }
{ "1" : { "relevancy" : [  "Y",  "Y" ] }, "_id" : ObjectId("530824b95f44eac1068b45c2") }
{ "1" : { "relevancy" : [  "N" ] }, "_id" : ObjectId("530824b95f44eac1068b45c3") }
{ "1" : { "relevancy" : [  "Y",  "Y" ] }, "_id" : ObjectId("530824b95f44eac1068b45c4") }
{ "1" : { "relevancy" : [  "Y",  "N" ] }, "_id" : ObjectId("530824b95f44eac1068b45c6") }
{ "1" : { "relevancy" : …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

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

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

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 $ in对阵数组对象的字段而不是数组对象

arr=[{field1:<value1>,field2:<value2}.....]
Run Code Online (Sandbox Code Playgroud)

我想使用$in运营商反对field1arr.我知道我可以创建一个虚拟数组并推送虚拟数组中的field1值.但有没有办法使用$in运算符对阵列的特定字段?

arr数组与集合无关.

我想查询所有的文件上的特定字段的值是field1arr- FIELD1应该是运营商的右手边$in

例:

arr=[{name:'foo',location:'NY'},{name:'bar',location:'LA'},{name:'foobar',location:'NZ'}]

db.collection.find({fieldx:<Here I want some method to obtain all documents whose fieldx values are in the location field of arr>})
Run Code Online (Sandbox Code Playgroud)

输出应包含其fieldx值在location字段中存在的文档arr.

查询的输出应该是

[{... 
    fieldx:'NY',
...
},
{...
    fieldx:'LA',
...
},
{...
    fieldx:'NZ',
...
}]
Run Code Online (Sandbox Code Playgroud)

fieldx是我正在查询的集合中的字段.它不是我提供的数组的字段(arr).我想将它与location数组的字段()匹配- arr我正在提供查询.

javascript mongoose mongodb mongodb-query aggregation-framework

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

MongoDB elemmatch数组中的多个元素

我有一个像mongodb的文件

    {
        "_id" : ObjectId("54e66b2da7b5f3a92e09dc6c"),
        "SomeMetric" : [ 
            {
                //some object
            }
            {
                //some object
            } 
         ],
        "FilterMetric" : [ 
            {
                "min" : "0.00",
                "max" : "16.83",
                "avg" : "0.00",
                "class" : "s1"
            }, 
            {
                "min" : "0.00",
                "max" : "16.83",
                "avg" : "0.00",
                "class" : "s2"
            }, 
            {
                "min" : "0.00",
                "max" : "16.83",
                "avg" : "0.00",
                "class" : "s1"
            }, 
            {
                "min" : "0.00",
                "max" : "16.83",
                "avg" : "0.00",
                "class" : "s2"
            } 
        ]
    }
Run Code Online (Sandbox Code Playgroud)

通常它包含许多这样的嵌套数组.我想单独设计一个指标,只有具有我搜索条件的数组.我有查询

db.sample.find( …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

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

在mongodb聚合管道中将毫秒转换为日期为group by?

我必须在mongodb聚合pipiline中将毫秒转换为日期格式 -

我的疑问是 -

db.campaign_wallet.aggregate({"$match" : {"campaignId" : 1, "txnTime" : { "$gte" : 1429554600000, "$lte" : 1430159400000}}}, {"$group" : {"_id" : {"msisdn" : "$msisdn", "txnTime" : "$txnTime"}, "count" : {"$sum": 1}}});
Run Code Online (Sandbox Code Playgroud)

在此查询中如何将txnTime(以毫秒为单位)转换为管道中的日期?

mongodb mongodb-query aggregation-framework

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

如何删除mongodb中组返回的文件?

我是mongodb初学者,我正在做一个家庭作业问题,数据集看起来像这样

{ "_id" : { "$oid" : "50906d7fa3c412bb040eb577" }, "student_id" : 0, "type" : "exam", "score" : 54.6535436362647 }
{ "_id" : { "$oid" : "50906d7fa3c412bb040eb578" }, "student_id" : 0, "type" : "quiz", "score" : 31.95004496742112 }
{ "_id" : { "$oid" : "50906d7fa3c412bb040eb579" }, "student_id" : 0, "type" : "homework", "score" : 14.8504576811645 }
{ "_id" : { "$oid" : "50906d7fa3c412bb040eb57a" }, "student_id" : 0, "type" : "homework", "score" : 63.98402553675503 }
{ "_id" : { "$oid" : "50906d7fa3c412bb040eb57b" …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

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

MongoDB - 使用$ group在$ lookup后重绕$ unwind嵌套数组

MongoDB聚合按分钟呈指数级复杂化!

我在迄今为$unwind嵌套数组,然后执行$lookup_id每一个对象的从unwinded嵌套数组.我的最后一次尝试是逆转放松$group.但是,我无法使用其原始属性名称以及每个文档的其余原始直接属性重建原始嵌入数组.

这是我到目前为止的尝试:

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

我得到的是这样的:

{
    "_id" : "A_USER_ID",
    "emails" : [
        {
            "address" : "AN_EMAIL_ADDRESS",
            "verified" : false
        }
    ],
    "profile" : {
        "name" …
Run Code Online (Sandbox Code Playgroud)

join mongodb mongodb-query aggregation-framework mongodb-aggregation

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