【问题标题】:Mongodb $expr on array数组上的MongoDB $expr
【发布时间】:2020-06-14 14:47:33
【问题描述】:

MongoDB:4.0.13

我在理解 $expr 和使用数组时遇到了麻烦。

让我们开始并使用以下文档创建一个新集合 (dbRepeatElement):

db.testRepeatElement.insert([
{
    "data" : {
        "FlsResSemires_2" : {
            "Sospensione" : [
                {
                    "DataInizio" : 1548806400000,
                    "DataFine" : 1549065600000,
                    "Motivazione" : "1"
                }
            ]
        }
    },
    "derived" : {
        "DATAFINEANNORIFERIMENTO" : 1609372800000,
        "regione190" : "190",
        "REGAOEROG" : "190209820300",
        "REGASLEROG" : "190209"
    }
}    
])

在更大的聚合中,以下部分不起作用:

db.testRepeatElement.aggregate([
    {
        $match: {
             $expr: {
                 $gt: ["$data.FlsResSemires_2.Sospensione.DataInizio", "$derived.DATAFINEANNORIFERIMENTO"]
             }
        }
    }

])

结果:返回匹配项(错误!只需检查日期)

阅读 mongodb 文档似乎是,结合使用数组、聚合和 $expr 不会返回预期结果,您必须指定要检查的数组元素,例如:

db.testRepeatElement.aggregate([
    {
        $match: {
             $expr: {
                 $gt: ["$data.FlsResSemires_2.0.Sospensione.DataInizio", "$derived.DATAFINEANNORIFERIMENTO"]
             }
        }
    }

])

结果:返回不匹配(正确!)

问题:我的要求是检查数组中的每个元素,那么如何在不使用 $unwind 的情况下解决这个问题?为什么会有这样的结果?

【问题讨论】:

  • 你必须在$project(或addFileds)阶段使用$filter
  • 你能提供一个完整的答案吗?提前致谢!

标签: mongodb aggregation-framework


【解决方案1】:

$filter 聚合运算符用于对数组元素进行匹配 操作。以下聚合查询将仅生成与 $gt 条件匹配的 Sospensione 数组元素:

db.testRepeatElement.aggregate( [
{
  $addFields: {
      "data.FlsResSemires_2.Sospensione": {
          $filter: {
              input: "$data.FlsResSemires_2.Sospensione",
              cond: {
                $gt: [ "$$this.DataInizio", "$derived.DATAFINEANNORIFERIMENTO" ]
              }
          }
      }
  }
},
{
   $match: { 
       $expr: {
            $gt: [ { $size: "$data.FlsResSemires_2.Sospensione" }, 0 ]
       }
   }
}
] ).pretty()

【讨论】:

  • 我不知道如何解释结果,我有: { "_id" : ObjectId("5e5d05c435fcda1954b46ea3"), "data" : { "FlsResSemires_2" : { "Sospensione" : [ ] } },“派生”:{“DATAFINEANNORIFERIMENTO”:1609372800000,“regione190”:“190”,“REGAOEROG”:“190209820300”,“REGASLEROG”:“190209”}} 是什么意思 Sospensione:[]?
  • Sospensione : [] 是什么意思?:表示cond 中指定的条件与Sospensione 数组元素中的任何一个都不匹配。跨度>
  • 好的,所以我必须使用匹配所有具有空数组的文档进行过滤,因为它们不匹配主要条件。谢谢!顺便说一句:我真的很惊讶 mongodb 没有本地方法来做到这一点并且需要额外的步骤..
  • 几分钟前我刚刚这样做,在空数组上看到类似的过滤器:stackoverflow.com/questions/60487519/…
  • 所以我必须使用匹配所有具有空数组的文档来过滤...:我为此添加了代码。它从输出中删除具有空数组的文档。
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多