标签: aggregation-framework

$ unwind empty array

我有一组用户,每个文档都有以下结构:

{
  "_id": "<id>",
  "login": "xxx",
  "solved": [
    {
      "problem": "<problemID>",
      "points": 10
    },
    ...
  ]
}
Run Code Online (Sandbox Code Playgroud)

该字段solved可能为空或包含任意多个子文档.我的目标是获得一个用户列表以及总分(总和points),其中尚未解决任何问题的用户将被分配总分为0.这是否可以通过单个查询执行此操作(理想情况下使用聚合框架)?

我试图在聚合框架中使用以下查询:

{ "$group": {
  "_id": "$_id",
  "login": { "$first": "$login" },
  "solved": { "$addToSet": { "points": 0 } }
} }
{ "$unwind": "$solved" }
{ "$group": {
  "_id": "$_id",
  "login": { "$first": "$login" },
  "solved": { "$sum": "$solved.points" }
} }
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

exception: The top-level _id field is the only field currently supported for exclusion
Run Code Online (Sandbox Code Playgroud)

先感谢您

mongodb aggregation-framework

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

使用MongoDB聚合框架舍入到小数点后2位

我正在使用mongodb聚合框架并进行一些计算,如下所示

db.RptAgg.aggregate( 
{ $group :
 { _id : {Region:"$RegionTxt",Mth:"$Month"},           
   ActSls:{$sum:"$ActSls"},
   PlnSls:{$sum:"$PlnSls"}
 } 
},
{ $project : 
 {
   ActSls:1,
   PlnSls:1,
   ActToPln:{$cond:[{ $ne: ["$PlnSls", 0] },{$multiply:[{$divide: ['$ActSls', '$PlnSls']},100]},0]}
  }

}

); 
Run Code Online (Sandbox Code Playgroud)

我想弄清楚将结果舍入到2位小数的最佳和最简单的方法是什么.以下是我的结果

{
    "result" : [
            {
                    "_id" : {
                            "Region" : "East",
                            "Mth" : 201301
                    },
                    "ActSls" : 72,
                    "PlnSls" : 102,
                    "ActToPln" : 70.58823529411765
            }
    ],
    "ok" : 1
Run Code Online (Sandbox Code Playgroud)

}

我希望"ActToPln"在aggegation框架本身的结果中显示70.59而不是"ActToPln":70.58823529411765.我想避免在我的应用程序中进行舍入

你能帮忙吗?

以下是我使用的数据集.

{
    "_id" : ObjectId("51d67ef69557c507cb172572"),
    "RegionTxt" : "East",
    "Month" : 201301,
    "Date" …
Run Code Online (Sandbox Code Playgroud)

rounding mongodb aggregation-framework

22
推荐指数
5
解决办法
3万
查看次数

Mongodb聚合管道如何限制组推

我无法使用聚合管道限制组函数中推送元素的数量.这可能吗?小例子:

数据:

[
    {
        "submitted": date,
        "loc": {
            "lng": 13.739251,
            "lat": 51.049893
        },
        "name": "first",
        "preview": "my first"
    },
    {
        "submitted": date,
        "loc": {
            "lng": 13.639241,
            "lat": 51.149883
        },
        "name": "second",
        "preview": "my second"
    },
    {
        "submitted": date,
        "loc": {
            "lng": 13.715422,
            "lat": 51.056384
        },
        "name": "nearpoint2",
        "preview": "my nearpoint2"
    }
]
Run Code Online (Sandbox Code Playgroud)

这是我的聚合管道:

  var pipeline = [{
    //I want to limit the data to a certain area
    $match: {
        loc: {
            $geoWithin: {
                $box: [
                    [locBottomLeft.lng, locBottomLeft.lat],
                    [locUpperRight.lng, locUpperRight.lat]
                ] …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

22
推荐指数
2
解决办法
5083
查看次数

猫鼬:如何使用聚合并一起找到

我如何在Mongoose中使用聚合find一起?
即我有以下架构:

const schema = new Mongoose.Schema({
  created: { type: Date, default: Date.now() },
  name: { type: String, default: 'development' }
  followers: [{ type: Mongoose.Schema.ObjectId, ref: 'Users'}]
...
})

export default Mongoose.model('Locations', schema)
Run Code Online (Sandbox Code Playgroud)

如何仅使用字段name和查询用户followers_count.
followers_count:长度followers.

在那里,我知道我们可以使用select来获得该字段name.
我们怎么能算得上followers

mongoose mongodb node.js mongodb-query aggregation-framework

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

将日期从毫秒转换为ISODate对象

我试图按小时聚合MongoDB colloection中的记录,并需要将存储为timestamp(毫秒)的日期转换为ISODate,以便我可以使用聚合框架的内置日期运算符($ hour,$ month等)

记录存储为

{ 
"data" : { "UserId" : "abc", "ProjId" : "xyz"}, 
"time" : NumberLong("1395140780706"),
"_id" : ObjectId("532828ac338ed9c33aa8eca7") 
} 
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用以下类型的聚合查询:

db.events.aggregate(
    { 
       $match : { 
         "time" : { $gte : 1395186209804, $lte : 1395192902825 } 
       } 
    }, 
    { 
       $project : {
         _id : "$_id", 
         dt : {$concat : (Date("$time")).toString()} // need to project as ISODate
       } 
    },
    // process records further in $project or $group clause
)
Run Code Online (Sandbox Code Playgroud)

产生以下形式的结果:

{
    "result" : [
        { 
            "_id" : ObjectId("5328da21fd207d9c3567d3ec"), 
            "dt" …
Run Code Online (Sandbox Code Playgroud)

javascript type-conversion mongodb aggregation-framework

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

计算MongoDB聚合框架的中位数

我是MongoDB聚合的新手,想知道是否有办法使用MongoDB聚合框架计算中值?

干杯,

刘易斯

mongodb nosql aggregation-framework

20
推荐指数
5
解决办法
8529
查看次数

$ lookup后的聚合过滤器

如何在$ lookup之后添加过滤器,还是有其他方法可以执行此操作?

我的数据收集测试是:

{ "_id" : ObjectId("570557d4094a4514fc1291d6"), "id" : 100, "value" : "0", "contain" : [ ] }
{ "_id" : ObjectId("570557d4094a4514fc1291d7"), "id" : 110, "value" : "1", "contain" : [ 100 ] }
{ "_id" : ObjectId("570557d4094a4514fc1291d8"), "id" : 120, "value" : "1", "contain" : [ 100 ] }
{ "_id" : ObjectId("570557d4094a4514fc1291d9"), "id" : 121, "value" : "2", "contain" : [ 100, 120 ] }
Run Code Online (Sandbox Code Playgroud)

我选择id 100并聚合孩子:

db.test.aggregate([ {
  $match : {
    id: 100
  }
}, {
  $lookup …
Run Code Online (Sandbox Code Playgroud)

javascript mongodb mongodb-query aggregation-framework

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

使用 MongoDB Compass 导出聚合数据

在应用最后阶段的聚合后,我们可以从 MongoDB 指南针“聚合”部分导出聚合数据吗?就像我们可以使用“文档”部分下的“导出数据”选项轻松完成此操作,我们可以选择将其导出为 JSON 和 CSV。我只看到从左侧导出聚合代码的选项。

mongodb aggregation-framework mongodb-compass

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

MongoDB聚合 - 匹配数组中的值

我有一个我正在进行聚合的集合,我基本上已经把它归结为

{array:[1,2,3], value: 1},
{array:[1,2,3], value: 4}
Run Code Online (Sandbox Code Playgroud)

如何执行聚合匹配以检查值是否在数组中?我尝试使用,{$match: {"array: {$in: ["$value"]}}}但它没有找到任何东西.

我希望输出(如果使用上面的例子)是:

{array:[1,2,3], value:1}
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

19
推荐指数
5
解决办法
4万
查看次数

使用$ lookup运算符的多个连接条件

这是我的收藏:

collection1:

{
    user1: 1,
    user2: 2,
    percent: 0.56
}
Run Code Online (Sandbox Code Playgroud)

collection2:

{
    user1: 1,
    user2: 2,
    percent: 0.3
}
Run Code Online (Sandbox Code Playgroud)

我希望通过'user1'和'user2'加入这两个集合.

结果如下:

{
    user1: 1,
    user2: 2,
    percent1: 0.56,
    percent2: 0.3
}
Run Code Online (Sandbox Code Playgroud)

我该如何编写管道?

mongodb mongodb-query aggregation-framework

19
推荐指数
3
解决办法
4万
查看次数