标签: aggregation-framework

在$ group中的mongodb聚合框架中使用$ regex

请考虑以下示例:

db.article.aggregate(
  { $group : {
      _id : "$author",
      docsPerAuthor : { $sum : 1 },
      viewsPerAuthor : { $sum : "$pageViews" }
  }}
);
Run Code Online (Sandbox Code Playgroud)

这个由作者字段分组并计算两个字段.

我有$ author = FirstName_LastName的值.现在不是按$ author分组,而是希望由共享相同LastName的所有作者进行分组.

我试过$ regex在'_'后按所有匹配的字符串分组

$author.match(/_[a-zA-Z0-9]+$/)

db.article.aggregate(
  { $group : {
      _id : "$author".match(/_[a-zA-Z0-9]+$/),
      docsPerAuthor : { $sum : 1 },
      viewsPerAuthor : { $sum : "$pageViews" }
  }}
);

also tried the following:

 db.article.aggregate(
  { $group : {
      _id : {$author: {$regex: /_[a-zA-Z0-9]+$/}},
      docsPerAuthor : { $sum : 1 },
      viewsPerAuthor …
Run Code Online (Sandbox Code Playgroud)

regex mongodb aggregation-framework

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

从文档中的子数组中查找最高值

假设我有以下集合:

{ _id: 1, Array: [
  { K: "A", V: 8 },
  { K: "B", V: 5 },
  { K: "C", V: 13 } ] }

{ _id: 2, Array: [
  { K: "D", V: 12 },
  { K: "E", V: 14 },
  { K: "F", V: 2 } ] }
Run Code Online (Sandbox Code Playgroud)

我想运行一个返回具有最高"V"的子文档的查询,所以在这种情况下我会得到:

{ _id: 1, Array: [ { K: "E", V: 14 } ] }
Run Code Online (Sandbox Code Playgroud)

或者干脆:

{ K: "E", V: 14 }
Run Code Online (Sandbox Code Playgroud)

重要的是我希望Mongo服务器上的内存使用量为O(1)(无论我处理多少文档,内存使用量是不变的),我只想检索那个我需要的值的子文档(我不想下载超过必要的更多子文档).

我首选的方法是使用简单的查找查询,但我不确定这是否可行.我怀疑这也可以通过聚合框架(或map reduce?)来完成,但是看不出来.我不希望结果存储在临时集合中,而是直接返回给我的客户端(就像普通查询一样).

mongodb aggregation-framework

9
推荐指数
1
解决办法
6983
查看次数

MongoDB:无法从BSON类型EOO转换为Date

我试图使用聚合框架(使用ruby)并像这样投影日期:

db['requests'].aggregate([
{"$project" => {
    _id: 0, 
    method: '$method', 
    user: '$user', 
    year: {'$year' => '$timestamp'}
}}])
Run Code Online (Sandbox Code Playgroud)

该文件就像这样:

{
_id: ObjectId("5177d7d7df26358289da7dfd"),
timestamp: ISODate("2013-04-12T03:58:05+00:00"),
method: "POST",
status: "200",
inputsize: "874",
outputsize: "4981",
user: "131"
}
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

Mongo::OperationFailure: Database command 'aggregate' failed: (errmsg: 'exception: can't convert from BSON type EOO to Date'; code: '16006'; ok: '0.0').
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为如果我在与mongorestore导入的完全相同的数据库上运行它,它可以正常工作.

ruby database mongodb nosql aggregation-framework

9
推荐指数
1
解决办法
6658
查看次数

如何计算同一MongoDB聚合$ group查询中的多个键?

我有一个问题:

db.test.aggregate( {$group : { _id : '$key', frequency: { $sum : 1 } } } )
Run Code Online (Sandbox Code Playgroud)

这将获得测试集中每个密钥枚举的频率.基本上,我已经得到了密钥的分配.

现在想象一下我想获得key1,key2和key3的分布(因此有三种不同的分布).

显然,我可以使用每个单独的键运行此查询3次,但似乎我们可以通过允许它同时计算所有3个键来优化查询.我一直在玩它并搜索整个网络间,但到目前为止,我已经被委托运行三个单独的聚合查询或使用map/reduce函数.

有没有人有任何其他想法?

mongodb aggregation-framework

9
推荐指数
1
解决办法
7155
查看次数

Mongo聚合在数组元素上

我有一个类似的mongo文件

{ "_id" : 12, "location" : [ "Kannur","Hyderabad","Chennai","Bengaluru"] }
{ "_id" : 13, "location" : [ "Hyderabad","Chennai","Mysore","Ballary"] }
Run Code Online (Sandbox Code Playgroud)

从这里我如何获得位置聚合(不同的区域计数).就像是

Hyderabad 2, 
Kannur 1, 
Chennai 2, 
Bengaluru 1, 
Mysore 1, 
Ballary 1
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

9
推荐指数
1
解决办法
6797
查看次数

如何在mongo聚合$ group $ cond中使用$ in或$ nin

我希望通过拥有$或者财产来获得$ cond的$ sum:

db.collectionName.aggregate(
{
   "$group": {
     "_id":'$created_at',
     "count": {"$sum": 1},
     "count_failure": {
         "$sum": {
           "$cond": [
               {
                 "$id":
                  { "$in": [ 0,100,101,102,103,104,105 ] }
               }, 
               1,
               0
              ] 
           }
         }
    }  
 }
)
Run Code Online (Sandbox Code Playgroud)

但错误说: Invalid operator "$id"

语法有什么问题?或者我错误地写了查询.

目前我通过以下方式实现此目标

db.collectionName.aggregate(
{
   "$group": {
     "_id":'$created_at',
     "count": {"$sum": 1},
     "count_failure": {
         "$sum": {
           "$cond": [
               {
                 "$or":[
                  { "$eq": [ "$id", 0 ] },
                  { "$eq": [ "$id", 100 ]},
                  { "$eq": [ "$id", 101 ]},
                  { "$eq": [ "$id", 102 …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

9
推荐指数
1
解决办法
8823
查看次数

MongoDB Aggregation将字符串数组连接到单个字符串

我们试图将一个字符串数组'连接'到聚合内的单个字符串.

给出以下数据集:

收集1:

{
  id: 1234,
  field: 'test'
}
Run Code Online (Sandbox Code Playgroud)

收集2:

{
  id: 1111,
  collection1_id: 1234,
  name: 'Max'
},
{
  id: 1112,
  collection1_id: 1234,
  name: 'Andy'
}
Run Code Online (Sandbox Code Playgroud)

当前结果(查找后等):

{
  id: 1234,
  field: 'test',
  collection2: ['Max', 'Andy'] 
}
Run Code Online (Sandbox Code Playgroud)

期望的结果:

{
  id: 1234,
  field: 'test',
  collection2: 'Max, Andy'
}
Run Code Online (Sandbox Code Playgroud)

是否有可能将'collection2'加入单个字符串?我们尝试过,$concat但它只接受字符串.

mongodb aggregation-framework

9
推荐指数
1
解决办法
3547
查看次数

mongodb unwind数组嵌套在一个文档数组中

在MongoDB中,我需要能够在主文档内的数组内的文档中展开嵌套数组.

{
    "_id" : ObjectId("5808d700536d1a3d69f4cf51"),
    "last_name" : "Maity",
    "xiith_mark" : 58,
    "id" : "3539488",
    "first_name" : "Harshavardhan",
    "course_name" : "BE/B.Tech",
    "institute_name_string" : "Abhayapuri College, P.O. Abhayapuri",
    "profile_percentage" : 45,
    "xiith_mark_type" : "Percentage",
    "xth_mark_type" : "Percentage",
    "date_of_birth" : "14-April-1993",
    "xth_mark" : 30,
    "last_login" : 1470827224,
    "percentage" : 55,
    "job_details" : [
        {
            "status" : NumberLong(6),
            "applied_date" : NumberLong(1470831441),
            "job_id" : NumberLong(92928),
            "contact_viwed_status" : 0,
            "label_name" : [
                "shortlisted",
                "rejected"
            ],
            "questionnaire_status" : 0,
            "batch_id" : NumberLong(6),
            "call_letter" : NumberLong(812)
        }, 
        { …
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

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

如何在管道聚合中比较文档中的两个字段(mongoDB)

我有一个如下文件:

{
  "user_id": NumberLong(1),
  "updated_at": ISODate("2016-11-17T09:35:56.200Z"),
  "created_at": ISODate("2016-11-17T09:35:07.981Z"),
  "banners": {
    "normal_x970h90": "/images/banners/4/582d79cb3aef567d64621be9/photo-1440700265116-fe3f91810d72.jpg",
    "normal_x468h60": "/images/banners/4/582d79cb3aef567d64621be9/photo-1433354359170-23a4ae7338c6.jpg",
    "normal_x120h600": "/images/banners/4/582d79cb3aef567d64621be9/photo-1452570053594-1b985d6ea890.jpg"
  },
  "name": "jghjghjghj",
  "budget": "2000",
  "plan": null,
  "daily_budget": "232323",
  "daily_budget_auto": "",
  "href": "qls2.ir",
  "targets": {
    "cats": [
      "fun",
      "news"
    ],
    "region": "inIran",
    "iran_states": null,
    "os": "all",
    "gold_network": true,
    "dont_show_between_1_n_8": true
  },
  "payment": {
    "bank": "mellat",
    "tax": "add"
  },
  "click_cost": "102000",
  "status": null
}
Run Code Online (Sandbox Code Playgroud)

我想检查是否budget低于click_cost我在检查查询中的其他参数时:

db.bcamp.aggregate(
    [
        {
            $match:{
                $and: [ 
                    {"targets.cats":{
                        "$in" : ["all"]
                        }
                    },

                    {"banners.normal_x970h90":{
                        "$exists":true
                        }
                    }, …
Run Code Online (Sandbox Code Playgroud)

comparison pipeline document mongodb aggregation-framework

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

Mongodb递归查询

我的taxon集合中有以下架构:

{ 
  "_id": 1, 
  "na": [ "root_1",
        "root_2",
        "root_3" ], 
  "pa": 1 
},{
  "_id": 2, 
  "na": [ "name_1", 
        "name_2", 
        "name_3"], 
  "pa": 1
},{
  "_id": 4, 
  "na": [ "otherName_1", 
        "otherName_2", 
        "otherName_3"],
  "pa": 2
}
Run Code Online (Sandbox Code Playgroud)

每个文档都由父字段与另一个文档相关联,该字段对应于_id其父项.

我想执行递归搜索以获得以下结果:

{ "_id": 4, 
  "nameList": [ "otherName_1",
              "name_1",
              "root_1"]
} 
Run Code Online (Sandbox Code Playgroud)

从某个文件中_id获取na每个父项的数组的第一项,直到_id: 1达到 文档为止

我目前通过执行X查询得到这个结果(一个通过父文档,例如这里有3个),但我很确定这可以使用单个查询来实现.我已经看过新的$ graphLookup操作符了,但无法用它来解决问题...

是否可以使用MongoDB 3.4.1在单个查询中实现此目的?

编辑

我每次都会运行50个文档,因此最佳解决方案是将所有内容组合在一个查询中

例如,它看起来像

var listId = [ 4, 128, 553, 2728, ...];
var cursor = db.taxon.aggregate([
  {$match: …
Run Code Online (Sandbox Code Playgroud)

recursion mongodb aggregation-framework

9
推荐指数
1
解决办法
4981
查看次数