【问题标题】:Mongo db aggregation multiple conditionsMongoDB聚合多条件
【发布时间】:2014-06-08 16:08:58
【问题描述】:

我想投影一个集合,仅当字段在范围内时才应用导出值。

种类:

db.workouts.aggregate({
 $match: { user_id: ObjectId(".....") }
},
{
 $project: { 
        '20': { $cond: [ {$gt: [ "$avg_intensity", 20]} , '$total_volume', 0] }
    }    
 })

仅当 avg_intensity 在某个范围内时,我才需要获取该值。然后我将对投影结果进行分组和求和。

我正在尝试做的是应用 $gt 和 $lt 过滤器,但没有多大成功。

db.workouts.aggregate(
{
   $match: { user_id: ObjectId("....") }
},
{
$project: { 
        '20': { $cond: [ [{$gt: [ "$avg_intensity", 20]}, {$lt: [ "$avg_intensity", 25]}] ,    '$total_volume', 0] }
    }    
 })

如何同时应用 $gt 和 $lt 条件?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    要在 $cond 运算符下组合逻辑条件,然后用 $and 运算符包装条件:

    db.workouts.aggregate([
        { "$match": { "user_id": ObjectId("....") }},
        { "$project": { 
           "20": { "$cond": [
               { "$and": [ 
                   { "$gt": [ "$avg_intensity", 20 ] },
                   { "$lt": [ "$avg_intensity", 25 ] }
               ]},    
               "$total_volume", 
               0
           ]}
       }}
    ])
    

    【讨论】:

      【解决方案2】:

      如果我的要求正确,您应该将过滤器放在管道的匹配部分:

      db.workouts.aggregate( [
        { $match: { user_id: ObjectId("...."), "avg_intensity": { $gt: 20, $lte: 25 } } },
        { $group: { _id: ..., count: ... } }
      ] );
      

      【讨论】:

      • 这是一个解决方案,但我会做更多的查询。我忘了提到我需要制作更多的子集。 Es:取 20 到 40 之间的任何结果,然后取 40 到 60 之间的结果等......所以我想对它们进行分组,因为我可以有更多的子集,因为结果运行相同的聚合
      【解决方案3】:

      我们可以通过以下方式进行聚合,这里我使用了两个条件,分别是城市,年份

      db.getCollection('geolocations').aggregate(
         [{$unwind : '$geolocation'},
           {
             $group:
               {
                 _id: {city:"$geolocation.city",year: { $year: "$geolocation.date" }},
                 count: { $sum: 1 }
               }
           }
         ]
      )
      

      输出:

      /* 1 */
      {
          "_id" : {
              "city" : "Noida",
              "year" : 2020
          },
          "count" : 1.0
      }
      
      /* 2 */
      {
          "_id" : {
              "city" : "Villupuram",
              "year" : 2020
          },
          "count" : 1.0
      }
      
      /* 3 */
      {
          "_id" : {
              "city" : "Chennai",
              "year" : 2020
          },
          "count" : 2.0
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-17
        • 2019-03-05
        • 2023-03-16
        • 2020-08-02
        • 1970-01-01
        • 1970-01-01
        • 2021-02-22
        • 2020-02-15
        相关资源
        最近更新 更多