标签: aggregation-framework

Mongodb聚合计数数组/集大小

这是我的问题:

模型:

{application:"abc",date:Time.now,status:"1"user_id:[id1,id2,id4]}

{application:"abc",date:Time.yesterday,status:"1",user_id:[id1,id3,id5]}

{application:"abc",date:Time.yesterday-1,status:"1",user_id:[id1,id3,id5]}

我需要在一段时间内计算user_id的唯一数量.

预期结果:

{application:"abc",status:"1",unique_id_count:5}

我目前正在使用聚合框架并计算mongodb之外的ID.

{$ match:{application:"abc"}},{$ unwind:"$ users"},{$ group:{_ id:{status:"$ status"},users:{$ addToSet:"$ users"} }}

我的用户ID数组非常大,所以我必须迭代日期或者我将获得最大文档限制(16mb).

我也可以分组

{year:{$ year:"$ date"},month:{$ month:"$ date"},day:{$ dayOfMonth:"$ date"}

但我也得到了文件大小限制.

是否可以计算mongodb中的设置大小?

谢谢

mongodb aggregation-framework

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

对聚合addToSet结果进行排序

有没有办法将$ addToSet的结果作为排序数组?

我试图扩展管道和$展开数组,对它进行排序并再次分组,但结果仍然没有排序.

数组非常大,我试图避免在应用程序中对它们进行排序.


Document Example :

    {
      "_id" : ObjectId("52a84825cc8391ab188b4567"),
      "id" : 129624
      "message" : "Sample",
      "date" : "12-09-2013,17:34:34",
      "dt" : ISODate("2013-12-09T17:34:34.000Z"),

    }

查询:


    db.uEvents.aggregate(
    [
      {$match : {dt : {$gte : new Date(2014,01,01) , $lt : new Date(2015,01,17)}}}
      ,{$sort : {dt : 1}}
      , {$group : {
        _id : {
                id : "$id"
                , year : {'$year' : "$dt"}
                , month : {'$month' : "$dt"}
                , day : {'$dayOfMonth' : "$dt"}
            }
        ,dt : {$addToSet : "$dt"}

      }} …

mongodb aggregation-framework

12
推荐指数
1
解决办法
7306
查看次数

如何加快聚合查询?

以下是聚合查询:

[
  {
    "$match": {
      "UserId": {
        "$in": [
          5
        ]
      },
      "WorkflowStartTime": {
        "$gte": ISODate('2015-04-09T00:00:00.000Z'),
        "$lte": ISODate('2015-04-16T00:00:00.000Z')
      }
    }
  },
  {
    "$group": {
      "_id": {
        "Task": "$TaskId",
        "WorkflowId": "$WorkflowInstanceId"
      },
      "TaskName": {
        "$first": "$Task"
      },
      "StartTime": {
        "$first": "$StartTime"
      },
      "EndTime": {
        "$last": "$EndTime"
      },
      "LastExecutionTime": {
        "$last": "$StartTime"
      },
      "WorkflowName": {
        "$first": "$WorkflowName"
      }
    }
  },
  {
    "$project": {
      "_id": 1,
      "LastExecutionTime": 1,
      "TaskName": 1,
      "AverageExecutionTime": {
        "$subtract": [
          "$EndTime",
          "$StartTime"
        ]
      },
      "WorkflowName": 1
    }
  },
  { …
Run Code Online (Sandbox Code Playgroud)

java mongodb aggregation-framework mongo-java-driver

12
推荐指数
1
解决办法
287
查看次数

mongodb,pymongo,aggregate给出奇怪的输出(关于光标的东西)

我正在尝试获取数据库中包含最多条目的人员列表.

print db.points.aggregate(
   [
      {
         "$group":
                    {
                       "_id": "$created.user", 
                       "count":{"$sum":1}
                    }
      },
      {
         "$sort":
                   {"count":-1}
      }
   ]
)
Run Code Online (Sandbox Code Playgroud)

条目如下所示:

{
   u'id': u'342902', 
   u'_id': ObjectId('555af76a029d3b1b0ff9a4be'), 
   u'type': u'node', 
   u'pos': [48.9979746, 8.3719741], 
   u'created': {
                  u'changeset': u'7105928', 
                  u'version': u'4', 
                  u'uid': u'163673', 
                  u'timestamp': u'2011-01-27T18:05:54Z', 
                  u'user': u'Free_Jan'
               }
}
Run Code Online (Sandbox Code Playgroud)

我知道created.user存在并且可以访问.

我得到的输出仍然是:

<pymongo.command_cursor.CommandCursor object at 0x02ADD6B0>

我不应该得到一个排序列表?

mongodb pymongo aggregation-framework

12
推荐指数
1
解决办法
6628
查看次数

Meteor - Mongo聚合没有$ count阶段

我正在使用meteorhacks:聚合包来在Meteor中进行Mongo聚合.我想在管道的最后阶段得到计数,所以我使用这段代码:

Message.aggregate([
  {
    $match: {
      // ...
    }
  }, {
    $count: 'count'
  }
]);
Run Code Online (Sandbox Code Playgroud)

这很简单,应该可以工作,但我只收到这个错误:

Exception while invoking method 'methodname' 
MongoError: Unrecognized pipeline stage name: '$count'
...
Run Code Online (Sandbox Code Playgroud)

请帮忙,谢谢.

更新:这个问题不像编辑建议的那样重复,我的主要目的是找出为什么我不能使用$count

mongodb meteor mongodb-query aggregation-framework

12
推荐指数
1
解决办法
4700
查看次数

查找聚合性能差

我有两个系列

帖子:

{
    "_Id": "1",
    "_PostTypeId": "1",
    "_AcceptedAnswerId": "192",
    "_CreationDate": "2012-02-08T20:02:48.790",
    "_Score": "10",
    ...
    "_OwnerUserId": "6",
    ...
},
...
Run Code Online (Sandbox Code Playgroud)

和用户:

{
    "_Id": "1",
    "_Reputation": "101",
    "_CreationDate": "2012-02-08T19:45:13.447",
    "_DisplayName": "Geoff Dalgas",
    ...
    "_AccountId": "2"
},
...
Run Code Online (Sandbox Code Playgroud)

我想找到写5到15个帖子的用户.这是我的查询的样子:

db.posts.aggregate([
    {
        $lookup: {
            from: "users", 
            localField: "_OwnerUserId",
            foreignField: "_AccountId", 
            as: "X"
        }
    },  
    {
        $group: {
            _id: "$X._AccountId", 
            posts: { $sum: 1 }
        }
    },   
    {
        $match : {posts: {$gte: 5, $lte: 15}}
    },  
    {
        $sort: {posts: -1 }
    },
    {
        $project : …
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

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

如何监视 MongoDB 更改流中特定字段的更改

我正在使用 mongodb 的节点驱动程序在具有许多连续更新的字段的文档上启动更改流(通过插入/更新端的某些逻辑调用$set仅包含更改的字段),但我想仅监视特定字段的更改。我目前对此的尝试如下,但即使该字段不是更新的一部分,我也只会获得每次更新。

我认为“updateDescription.updatedFields”是我所追求的,但到目前为止我拥有的代码只是给了我所有的更新。

正确的 $match 过滤器会是什么样子来实现这样的目标?我想也许检查它是否是 $gte:1 可能是让它工作的黑客,但我仍然只是得到每个更新。我试过 $inc 来查看字段名称是否也在“updatedFields”中,但这似乎也不起作用。

const MongoClient = require('mongodb').MongoClient;

const uri = 'mongodb://localhost:27017/?replicaSet=rs0';
MongoClient.connect(uri, function(err, client) {

    const db = client.db('mydb');
    // Connect using MongoClient
    var filter = {
        $match: {
            "updateDescription.updatedFields.SomeFieldA": { $gte : 1 },
            operationType: 'update'
        }
    };

    var options = { fullDocument: 'updateLookup' };
    db.collection('somecollection').watch(filter, options).on('change', data => {
        console.log(new Date(), data);
    });
});
Run Code Online (Sandbox Code Playgroud)

mongodb node.js aggregation-framework

12
推荐指数
1
解决办法
8484
查看次数

Mongodb - 汇总$ push如果有条件的话

我正在尝试聚合一批文件.我想要推送的文件中有两个字段.但是,假设它们是"_id"和"A"字段,我只想要$ push"_id"和"A"如果"A"是$ gt 0.

我尝试了两种方法.

第一.

db.collection.aggregate([{
"$group":{
    "field": {
        "$push": {
            "$cond":[
                {"$gt":["$A", 0]},
                {"id": "$_id", "A":"$A"},
                null
            ]
        }
    },
    "secondField":{"$push":"$B"}
}])
Run Code Online (Sandbox Code Playgroud)

但这会将空值推到"字段",我不想要它.

第二个.

db.collection.aggregate([{
"$group":
    "field": {
        "$cond":[
            {"$gt",["$A", 0]},
            {"$push": {"id":"$_id", "A":"$A"}},
            null
        ]
    },
    "secondField":{"$push":"$B"}
}])
Run Code Online (Sandbox Code Playgroud)

第二个根本不起作用......

有没有办法在其他情况下跳过$ push?

添加:

预期文件:

{
    "_id":objectid(1),
    "A":2,
    "B":"One"
},
{
    "_id":objectid(2),
    "A":3,
    "B":"Two"
},
{
    "_id":objectid(3),
    "B":"Three"
}
Run Code Online (Sandbox Code Playgroud)

预期产出:

{
    "field":[
        {
            "A":"2",
            "_id":objectid(1)
        },
        {
            "A":"3",
            "_id":objectid(2)
        },
    ],
    "secondField":["One", "Two", "Three"]
}
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query mgo aggregation-framework

12
推荐指数
3
解决办法
8403
查看次数

查找数组中的最大元素

REF:来自具有字段值 max 的数组的 MongoDB 文档

查找文档中的子数组中的最高值MongoDB查找文档数组中的最大值中的答案建议使用排序+限制(1),但这确实很慢。当然有一种方法可以使用 $max 运算符。

假设在聚合匹配中获得这样的文档:

{
  _id: "notImportant",
  array: [
    {
      name: "Peter",
      age: 17
    },
    {
      name: "Carl",
      age: 21
    },
    {
      name: "Ben",
      age: 15
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

您想要找到年龄最高的(整个,而不仅仅是一个值)文档。如何使用 $max 运算符做到这一点?

我试过

unwind {"$array"}
project {"_id": 0, "name": "$array.name", "age": "$array.age"}
Run Code Online (Sandbox Code Playgroud)

所以我得到

{
  _id: null,
  name: "Peter",
  age: 17
}
{
  _id: null,
  name: "Carl",
  age: 21
}
{
  _id: null,
  name: "Ben",
  age: 15
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试匹配年龄:

age: {$eq: {$max: …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

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

Mongo平均聚合查询没有组

我试图使用Mongo中的聚合框架获得整个字段的平均值.但是,我似乎无法找到任何使用它而没有组参数的示例.

我有以下文档结构:

 {
      "_id" : ObjectId("5352703b61d2739b2ea44e4d"),
      "Semana" : "2014-02-23 - 2014-03-01",
      "bolsaDeValores" : "7",
      "bvc" : "8",
      "dollar" : "76",
      "ecopetrol" : "51",
      "dollarPrice" : "18"
 }
Run Code Online (Sandbox Code Playgroud)

基本上我想要做的是以最快的方式获得整个集合的bvc字段和任何其他数字字段的平均值(不使用MapReduce,因为它比聚合框架效率低).

我试图在大于零的基础上进行分组,但无济于事:

db.EvaluatedSentiments.aggregate([
    { "$group": { 
        "bvc" : {"$gt:0"}
        }, 
        {
            "bvc" : { "$avg" : "$bvc"}
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

我感谢您提供的任何帮助.

参考文献:Mongo聚合手册

mongodb aggregation-framework

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