当前位置: 首页 > 知识库问答 >
问题:

Mongodb。方法来限制仅具有“投影”(即筛选器)的给定字段的子文档?

黄流觞
2023-03-14

因为在MongoDB中没有办法过滤子文档(参考:如何使用MongoDB选择子文档)

MongoDB中是否有其他方法/方法可以快速删除/过滤没有给定字段、没有下例中的子文档字段的字段?

是唯一的方法来做到这一点,通过处理mongoDB外部的结果,并过滤掉所有空文档?

(想象一个情况,当你有一千个具有不同模式的subdocs。我做了一个. search(),得到了1000个子文档,但是900是空的。我只是想得到100,所以我不总是必须处理和删除MongoDB外面的空的。)

例如,您有一个JSON,它位于名为monday的集合中:

{
document : [
            {
             subdocument : "Hello World"
            },
            {
             subdocument : "Hello Moon"
            },
            {
             another_field: "Hello Sun"
            }
            ]
}

然后进行此查询db.monday.find ({},{_id: 0,"document.subdocument": 1})

结果将是:

    { "document" : [    
    {   "subdocument" : "Hello World" },    
    {   "subdocument" : "Hello Moon" },     
    {    } 
    ] }

您可以看到another_field仍然返回,尽管为空。


共有1个答案

乐华晖
2023-03-14

我相信在这种情况下会返回空字段,因为文档是一个数组,Mongodb不想更改任何元素的数组索引。

您可以使用聚合框架获取子文档数组:

db.monday.aggregate(
  [
    { $match: 
      {'document.subdocument' : 
        { $exists: 1 }
      }
    },
    { $unwind: "$document" }, 
    { $match: 
      {'document.subdocument' : 
        { $exists: 1 }
      }
    },
    { $project: { subdocument: "$document.subdocument", _id: 0 } }
  ])

产量:

 [
    {
        "subdocument" : "Hello World"
    },
    {
        "subdocument" : "Hello Moon"
    }
 ]

第一个$match不是必需的,如果有很多文档没有您要查找的任何子文档,它只会加快处理速度。

 类似资料:
  • 我正在查看MongoDB在和投影上的留档。我试图弄清楚如何只返回投影数组字段的子集,但我似乎无法弄清楚。 相关帖子: > 我没有试图从mongob聚合框架中执行$片-获取嵌套数组的第一个文档字段。 我也没有尝试从mongo projection中的仅返回数组值展平子文档,因为我仍然需要顶部文档中的一些字段。 假设我在集合中有以下文档: 我想要执行的查询是: 我希望它只返回数组中为的子文档下的。例如

  • MongoDB 中的投影即查询指定的字段,而不是直接查询文档的全部字段。比如说某个文档中有 5 个字段,而我们只需要其中的 3 个字段,那么就可以使用 MongoDB 中的投影来指定需要查询的 3 个字段。 在《 MongoDB查询文档》一节中我们介绍的 find() 方法,在使用 find() 方法时,如果不设置其中的第二个参数,那么在查询时将返回文档中的所有字段,想要限制要查询的字段,您就需要

  • 如果数据源包含许多数据或字段,你可能会发现将数据或字段限制为仅所需的内容会更为容易,从而可以简化数据选择。 筛选数据 筛选窗格让你可以方便地创建和应用为数据指定的筛选条件。在工具栏点击 “筛选”来启用筛选窗格。 若要添加一个新的条件到准则,只需简单地点击 。如果你需要在括号内添加条件,点击 。 【提示】若要在现有的条件添加括号,只需简单地右击已选择的条件并选择“使用括号分组”。若要移除括号,请右击

  • 如果数据源包含许多数据或字段,你可能会发现将数据或字段限制为仅所需的内容会更为容易,从而可以简化数据选择。 筛选数据 若要添加一个新的条件到准则,只需简单地点击 来启用筛选窗格。 若要添加一个新的条件到准则,只需简单地点击 。如果你需要在括号内添加条件,点击 。 【提示】若要在现有的条件添加括号,只需简单地按住 Control 键并点按已选择的条件,然后选择“使用括号分组”。若要移除括号,请按住

  • 如果数据源包含许多数据或字段,你可能会发现将数据或字段限制为仅所需的内容会更为容易,从而可以简化数据选择。 筛选数据 筛选窗格让你可以方便地创建和应用为数据指定的筛选条件。在工具栏点击 “筛选”来启用筛选窗格。 若要添加一个新的条件到准则,只需简单地点击 。如果你需要在括号内添加条件,点击 。 【提示】若要在现有的条件添加括号,只需简单地右击已选择的条件并选择“使用括号分组”。若要移除括号,请右击