标签: aggregation-framework

MongoDB 聚合管道多个组使管道复杂化

这是我的文档结构:

{
 "_id" : ObjectId("50dcd7ff4de274a2c4a31df0"),
 "seq_name" : "169:D18M6ACXX:1:1111:17898:82486:GTGACA_10",
 "raw_seq" : "TTGACCTGAGGAGACGGTGACCAGGGTTCCCTGGCCCCAGTAGTCAACGGGAGTTAGACTTCTCGCACAGTAATAAACAGCCGTGTCCTCGGCTCTCAGGCTGTTCATTTGCAGA",
 "seq_aa" : "LQMNSLRAEDTAVYYCARSLTPVDYWGQGTLVTVSSGQ",
 "cdr3_seq" : "GCGAGAAGTCTAACTCCCGTTGACTAC",
 "cdr3_seq_aa" : "ARSLTPVDY",
 "cdr3_seq_len" : 27,
 "cdr3_seq_aa_len" : 9,
 "vg" : "IGHV3-48*03",
 "dg" : "IGHD3-10*02R",
 "jg" : "IGHJ4*02",
 "donor" : 10
}
Run Code Online (Sandbox Code Playgroud)

我真的很喜欢 MongoDB 框架,但是我在使用这个分组管道时遇到了麻烦,因为我还不能 $out 到另一个集合。我可以做这个多分组管道。

db.collection.aggregate({$match:{cdr3_seq_aa_len:{$gt:3}},
   {$group:{_id:$cdr3_seq_aa,other_set:{$addToSet:$cdr3_seq_aa_len}}},
   {$group:{_id:$other_set,sum:{$sum:1}}})
Run Code Online (Sandbox Code Playgroud)

这给了我按长度分组的唯一$cdr3_seq_aa 的数量。

{ id:40, sum:1002031,
  id:41, sum:1949402,....
Run Code Online (Sandbox Code Playgroud)

然而,我想做的第一个手术是按捐赠者分组。所以我可以先知道每个捐助者之间有多少个唯一的 cdr3_seq_aa 字符串。然后我想按长度对它进行分组并计算有多少字符串与长度分组。

database mongodb aggregation-framework

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

无论如何要使用 mongoengine 在列中获得最大值?

我想知道是否有办法使用 Mongoengine 在 MongoDB 集合的列中获得最大值。是否可以?

python mongodb mongoengine aggregation-framework

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

从 mongodb geojson 点集合中查找最大、最小坐标值

我的用例相当简单:我在 mongodb 中有一组文档,地理坐标指定为 GeoJSON Point。

我想找到这个集合的边界框,定义为 lat min、long min、lat max、long max。

这些文件具有以下结构:

{
  "_id": ObjectId("538ed354b83897b4418b4567"),
  "name": "example point",
  "description": "",
  "location": {
    "type": "Point",
    "coordinates": [
      24.501885327447624,
      42.228924279974158
    ]
  },
  "status": "1",
  "type": "image"
}
Run Code Online (Sandbox Code Playgroud)

经过大量搜索和反复试验,我被困在如何继续。

我发现了一些很好的工作方法,它们适用于具有键/值对的子文档(数组),但到目前为止我还没有找到任何适用于普通数组(例如 GeoJSON 坐标对)的方法。

使用聚合时,我面临无法从 GeoJSON 点提取 X、Y 坐标的问题(尝试使用$slice: [0,1]$slice: [1,1]但这似乎在$project管道中不起作用)。放松似乎也不是正确的方法。

Map/reduce 对于 RDMS 中真正的基本查询来说看起来有点矫枉过正。

我最好的方法是什么(最新的 mongodb 版本 2.6.3)?

geolocation mongodb mongodb-query aggregation-framework

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

将 geoNear 查询与另一个值的查询结合起来

我有一个用 node.js mongodb 和 mongoose 实现的地理数据api。我想用两个条件查询我的数据。

首先,我使用 geoNear 来获取给定半径内的所有位置,这很好用。其次,我想按其类型进一步过滤位置。

这是我的架构:

var GeoLocationSchema   = new Schema({
    name: String,
    type: String,
    loc: {
        type: {
            type: String,
            required: true,
            enum: ["Point", "LineString", "Polygon"],
            default: "Point"
        },
        coordinates: [Number]
    }
});
// ensure the geo location uses 2dsphere
GeoLocationSchema.index({ loc : "2dsphere" });
Run Code Online (Sandbox Code Playgroud)

这是我的 geoNear 查询:

router.route("/locations/near/:lng/:lat/:type/:max")

    // get locations near the get params
    .get(function(req, res) {
        // setup geoJson for query
        var geoJson             = {};
        geoJson.type            = "Point";
        geoJson.coordinates     = [parseFloat(req.params.lng), parseFloat(req.params.lat)]; …
Run Code Online (Sandbox Code Playgroud)

geospatial mongoose mongodb node.js aggregation-framework

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

Mongodb Java 驱动程序在聚合查询中的使用限制

问题

查询工作正常但没有限制和跳过,它一次获取所有记录。

请建议我做错了什么。

MongoDB 集合

 {  
      "_id" : ObjectId("559666c4e4b07a176940c94f"),     
      "postId" : "559542b1e4b0108c9b6f390e",    
     "user" : {         
                 "userId" : "5596598ce4b07a176940c943",         
                 "displayName" : "User1",       
                 "username" : "user1",      
                 "image" : ""   
      },    
      "postFor" : {         
                     "type": "none",
                      "typeId" : ""     
      },    
     "actionType" : "like",     
     "isActive" : 1,
     "createdDate" : ISODate("2015-07-03T10:41:07.575Z"),   
     "updatedDate" : ISODate("2015-07-03T10:41:07.575Z") 
}
Run Code Online (Sandbox Code Playgroud)

Java驱动查询

 Aggregation aggregation = newAggregation(                                

      match(Criteria.where("isActive").is(1).and("user.userId").in(feedUsers)),
      group("postId")
      .last("postId").as("postId")
      .last("postFor").as("postFor")
      .last("actionType").as("actionType")
      .last("isActive").as("isActive")
      .last("user").as("user")
      .last("createdDate").as("createdDate")
      .last("updatedDate").as("updatedDate"),
      sort(Sort.Direction.DESC, "createdDate")
    );
aggregation.skip( skip );
aggregation.limit( limit );
AggregationResults<UserFeedAggregation> groupResults =
mongoOps.aggregate(aggregation, SocialActionsTrail.class, UserFeedAggregation.class);
return …
Run Code Online (Sandbox Code Playgroud)

java mongodb aggregation-framework spring-data-mongodb

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

如何根据条件推送一个字段?

我试图在MongoDB聚合管道的$ group阶段有条件地将字段推入数组.

基本上我有包含用户名的文档,以及他们执行的操作数组.

如果我将用户操作分组如下:

{ $group: { _id: { "name": "$user.name" }, "actions": { $push: $action"} } }
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

[{
    "_id": {
        "name": "Bob"
    },
    "actions": ["add", "wait", "subtract"]
}, {
    "_id": {
        "name": "Susan"
    },
    "actions": ["add"]
}, {
    "_id": {
        "name": "Susan"
    },
    "actions": ["add, subtract"]
}]
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.现在的想法是将actions数组组合在一起,以查看哪组用户操作最受欢迎.问题是我需要在考虑组之前删除"等待"操作.因此,结果应该是这样的,考虑到在分组中不应该考虑"wait"元素:

[{
    "_id": ["add"],
    "total": 1
}, {
    "_id": ["add", "subtract"],
    "total": 2
}]
Run Code Online (Sandbox Code Playgroud)

测试#1

如果我添加这个$ group阶段:

{ $group : { _id : "$actions", total: { $sum: 1} }} …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

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

MongoDB 聚合 - 不同计数特定元素

我的收藏包含以下文件。我想使用聚合来计算内部有多少客户,但我遇到了一些问题。我可以得到总行,但不能得到总(唯一)客户。

[{
    _id: "n001",
    channel: "Kalipare",
    trans: {
        _id: "trans001",
        customerID: "customerCXLA93",
        customerName: "Kalipare Fried Chicked"
    }
}, {
    _id: "n002",
    channel: "Kalipare",
    trans: {
        _id: "trans002",
        customerID: "customerCXLA93",
        customerName: "Kalipare Fried Chicked"
    }
}, {
    _id: "n003",
    channel: "Kalipare",
    trans: {
        _id: "trans003",
        customerID: "customerPWR293",
        customerName: "Kalipare Papabun"
    }
}, {
    _id: "n004",
    channel: "Kalipare",
    trans: {
        _id: "trans004",
        customerID: "customerPWR293",
        customerName: "Kalipare Papabun"
    }
}, {
    _id: "n005",
    channel: "Tumpakrejo",
    trans: {
        _id: "trans005",
        customerID: "customerPWR293",
        customerName: "Tumpakrejo …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

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

获取按日期分组的列中不同值的计数 mongodb

我正在尝试运行一个 mongodb 查询,对于请求的每一天,它将返回不同列中唯一值的计数。例如,对于六月,查询将返回日期以及该日期 b 列中不同值的计数。任何人都知道如何做到这一点我尝试了几种不同的方法但没有运气

下面是几个示例文档,以及输出应该是什么

{
  "_id" : ObjectId("578fa05a7391bb0d34bd3c28"),
  "IP" : "123.123.123.123",
  "datetime" : ISODate("2016-07-20T10:04:56-05:00")
},
{
  "_id" : ObjectId("578fa05a7391bb0d34bd3c28"),
  "IP" : "110.123.1.2",
  "datetime" : ISODate("2016-07-20T10:04:56-05:00"),
}
Run Code Online (Sandbox Code Playgroud)

输出应该是

{
"date":"2016-07-20",
count:2 -- this is distinct number of IPs for the date above
}
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

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

Mongodb聚合嵌套组

我在我的收藏中分配了人物,状态就像下面一样

[
 {"ASSIGN_ID": "583f84bce58725f76b322398", "STATUS": 1},
 {"ASSIGN_ID": "583f84bce58725f76b322398","STATUS": 4},
 {"ASSIGN_ID": "583f84bce58725f76b322398","STATUS": 4},
 {"ASSIGN_ID": "583f84bce58725f76b322398","STATUS": 3},
 {"ASSIGN_ID": "583f84bce58725f76b322311","STATUS": 1},
 {"ASSIGN_ID": "583f84bce58725f76b322311","STATUS": 3},
 {"ASSIGN_ID": "583f84bce58725f76b322322","STATUS": 1},
 {"ASSIGN_ID": "583f84bce58725f76b322322","STATUS": 4}
]
Run Code Online (Sandbox Code Playgroud)

我想通过ASSIGN_ID对这些数据进行分组,并通过每个STATUSSTATUS计数对其进行分组,如下所示.

[  
   {  
      "ASSIGN_ID":"583f84bce58725f76b322398",
      "STATUS_GROUP":[  
         {  
            "STATUS":1,
            "COUNT":1
         },
         {  
            "STATUS":3,
            "COUNT":1
         },
         {  
            "STATUS":4,
            "COUNT":2
         }
      ]
   },
   {  
      "ASSIGN_ID":"583f84bce58725f76b322311",
      "STATUS_GROUP":[  
         {  
            "STATUS":1,
            "COUNT":1
         },
         {  
            "STATUS":3,
            "COUNT":1
         }
      ]
   },
   {  
      "ASSIGN_ID":"583f84bce58725f76b322322",
      "STATUS_GROUP":[  
         {  
            "STATUS":1,
            "COUNT":1
         },
         {  
            "STATUS":4,
            "COUNT":1 …
Run Code Online (Sandbox Code Playgroud)

javascript mongoose mongodb node.js aggregation-framework

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

将$ graphLookup的ObjectId与String匹配

我正在尝试运行$graphLookup类似以下所示的示例:

$ graphLookup示例

目的是在给定特定记录($match在此处有注释)的情况下,通过immediateAncestors属性检索其完整的“路径” 。如您所见,这没有发生。

$convert在这里介绍了_idfrom的处理方式,因为string相信可以与_idfrom immediateAncestors记录列表(是string)“匹配” 。

因此,我确实使用不同的数据运行了另一个测试(不ObjectId涉及):

db.nodos.insert({"id":5,"name":"cinco","children":[{"id":4}]})
db.nodos.insert({"id":4,"name":"quatro","ancestors":[{"id":5}],"children":[{"id":3}]})
db.nodos.insert({"id":6,"name":"seis","children":[{"id":3}]})
db.nodos.insert({"id":1,"name":"um","children":[{"id":2}]})
db.nodos.insert({"id":2,"name":"dois","ancestors":[{"id":1}],"children":[{"id":3}]})
db.nodos.insert({"id":3,"name":"três","ancestors":[{"id":2},{"id":4},{"id":6}]})
db.nodos.insert({"id":7,"name":"sete","children":[{"id":5}]})
Run Code Online (Sandbox Code Playgroud)

和查询:

db.nodos.aggregate( [
  { $match: { "id": 3 } },
  { $graphLookup: {
      from: "nodos",
      startWith: "$ancestors.id",
      connectFromField: "ancestors.id",
      connectToField: "id",
      as: "ANCESTORS_FROM_BEGINNING"
    }
  },
  { $project: {
      "name": 1,
      "id": 1,
      "ANCESTORS_FROM_BEGINNING": "$ANCESTORS_FROM_BEGINNING.id"
    }
  }
] )
Run Code Online (Sandbox Code Playgroud)

...输出了我期望的结果(这5条记录直接或间接与id3 条记录相关):

{
    "_id" : ObjectId("5afe270fb4719112b613f1b4"),
    "id" …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

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