MongoDB查询在过滤数组后根据数组大小返回所有内容?

Posted

技术标签:

【中文标题】MongoDB查询在过滤数组后根据数组大小返回所有内容?【英文标题】:MongoDB query to return all based on an array size after filtering array? 【发布时间】: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"
      
    ]
  
]

【问题讨论】:

【参考方案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

以上是关于MongoDB查询在过滤数组后根据数组大小返回所有内容?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB Compass:对数组对象的过滤查询不起作用

如何根据MongoDB中文档字段中的每个数组项过滤集合

$eq 内部过滤器不适用于数组字段 - Mongodb

如何在mongodb的单个json文档中过滤对象数组? [复制]

Mongodb聚合数组大小大于匹配[重复]

Mongodb聚合数组大小大于匹配[重复]