【问题标题】:MongoDB query to return all based on an array size after filtering array?MongoDB查询在过滤数组后根据数组大小返回所有内容?
【发布时间】:2021-12-28 18:27:20
【问题描述】:

我正在尝试为 Mongo 查找查询创建一个模板,该模板将返回与数组属性的给定大小匹配的所有内容。例如,这是查找包含大小为 5 的数组的所有文档的查询:

{ arrayProperty: { $size: 5} }

问题:其中一些数组的值为“nil”,并且不希望在查询大小时计算这些值。例如,我希望在查询大小为 5 时返回包含这样结构的数组的文档:

[0,1,2,3,"nil"]

我已经在聚合框架中做了这样的事情:

  [
      {
         $project: {
            item: 1,
            numberOfItems: { $size: {
              $filter: {
                input: "$arrayProperty",
                cond: { $ne: [ "$$this", "nil" ] }
              }
            }
            }
         }
      }
   ]

这是计算每个数组的长度/大小,并将该数字推送到名为 numberOfItems 的数组中。我相信我需要将过滤后的结果传递给 $size 运算符。不过,我似乎无法弄清楚如何在查找查询语法中利用这一点,我迫切需要一些帮助。

我所描述的流程的想法是这样的,尽管这是无效的:

    {$expr:{
      $filter: {
        input: "$arrayProperty",
        cond: { $ne: [ "$$this", "nil" ] }
      }: { $size: 5 }
    }}

谁能帮助我?如何正确地将过滤结果传递给 $size 运算符?我找不到人们试图做这样的事情的任何其他问题/答案。

另一种情况是当“nil”作为值嵌套在数组中的 JSON 对象中时,我知道这需要不同的解决方案。示例:

[
  {
    "arrayProperty": [
      {
        "model": "sedan",
        "turbo": "nil"
      },
      {
        "model": "sedan",
        "turbo": "60cc"
      }
    ]
  },
  {
    "arrayProperty": [
      {
        "model": "coupe",
        "turbo": "50cc"
      },
      {
        "model": "coupe",
        "turbo": "60cc"
      }
    ]
  }
]

【问题讨论】:

    标签: mongodb find size aggregation


    【解决方案1】:

    你可以试试$ne条件一起$size条件,

    db.collection.find({
      arrayProperty: {
        $size: 5,
        $ne: "nil"
      }
    })
    

    Playground


    另一种情况是当“nil”作为值嵌套在数组中的 JSON 对象中时,我知道这需要不同的解决方案。

    db.collection.find({
      "arrayProperty.turbo": {
        $ne: "nil"
      },
      arrayProperty: {
        $size: 2
      }
    })
    

    Playground

    【讨论】:

    • 这是完美的,谢谢。我可以再给你一个吗,如果“nil”在嵌套的 JSON 对象中,你会怎么做?我的实验导致所有结果仍然返回,这里是示例:mongoplayground.net/p/8HoS1ZJNW5b 将使用此编辑原始问题以及未来的观众。
    • 测试子文档字段,使用点符号。还要注意可能意外排除了此选项中的第三个选择:mongoplayground.net/p/0nx7au-xPrM
    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多