【问题标题】:mongodb find element in nested arraymongodb在嵌套数组中查找元素
【发布时间】:2021-08-27 00:44:03
【问题描述】:

我需要创建聚合器,条件是 dat 中的任何元素都小于 -85 它首先显示带有日期和时间的 ArrObj 列表。

我绑定了以下聚合器语句,但无法获得结果。

{
  'ArrObj.dat':{
    $filter:{
      input:'$ArrObj.dat',
      as:"res",
      cond:{
             $gt:["$$res",-80],
      }
      
    }
  }
}

数据库结构

    "ArryObj": [{
    "dat": [-84.2, -83.9, -84.9, -85.3, -86.8, -85.6, -84.6, -86.4],
    "Date": "26-05-2021",
    "Time": "13:02:42",
    },{
    "dat": [-90.2, -83.9, -84.9, -85.3, -86.0, -85.0, -84.2, -86.4],
    "Date": "26-05-2021",
    "Time": "13:02:42",
    }]

要求的结果

        "ArryObj": [{
        "dat": [-90.2, -83.9, -84.9, -85.3, -86.0, -85.0, -84.2, -86.4],
        "Date": "26-05-2021",
        "Time": "13:02:42",
        }]

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    你需要$map$filter

    • $map 循环遍历所有对象
    • $filter 在循环时过滤 y 条件

    这里是代码

    db.collection.aggregate([
      {
        $project: {
          "ArryObj": {
            "$map": {
              "input": "$ArryObj",
              "as": "arr",
              "in": {
                "dat": {
                  "$filter": {
                    "input": "$$arr.dat",
                    "as": "d",
                    "cond": {
                      $gt: [ "$$d", -85 ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    ])
    

    工作Mongo playground

    【讨论】:

    • 您好 varman,代码有效,我需要再添加一个阶段来更新结果,例如 if dat > -85 make -90 ,我们需要在 map 中使用 if 条件还是需要添加另一个更新阶段
    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 2022-06-11
    • 2022-11-11
    • 2015-06-20
    • 2018-10-06
    • 2015-05-18
    • 2022-01-19
    • 2018-05-06
    相关资源
    最近更新 更多