蒙古数据库。限制仅具有“投影”(即过滤器)的给定字段的子文档的方法?

Posted

技术标签:

【中文标题】蒙古数据库。限制仅具有“投影”(即过滤器)的给定字段的子文档的方法?【英文标题】:Mongodb. Method to limit subdocuments that only have the given fields of the `projection` (that is, filter)? 【发布时间】:2013-05-22 13:37:06 【问题描述】:

因为MongoDB中没有办法过滤子文档(参考:How to select subdocuments with MongoDB)

在 MongoDB 中是否有另一种方式/方法可以快速删除/过滤没有给定字段的字段,在下面的示例中没有 subdocument 字段?

是否只有通过处理 在 mongodb 之外 的结果并过滤掉所有空文档来做到这一点?

(想象一下,当您有一千个具有不同架构的子文档时。我执行 .find() 并获得 1000 个子文档,但 900 个是空的。我只想获得 100 个,所以我并不总是有在 MongoDB 之外处理和删除空的。)

例如,您有一个位于collection named monday 中的 JSON:


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】:

我相信在这种情况下会返回空字段,因为 document 是一个数组,而 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 不想更改索引。我想要的是仅获取子文档的数据库端过滤器。想象一下,当您有一千个具有不同模式的子文档时。我做了一个 db.monday.find() 并得到 1000 个子文档,但 900 个是空的。我只想得到 100 个,所以我不必总是处理和丢弃空的。 答案已更新为仅返回子文档。如果您想要文档 ID 连同它们一起删除 $project。 (请参阅此答案的修订版 2。) 简直太棒了!我刚测试过。 (我现在必须更多地探索聚合框架。)

以上是关于蒙古数据库。限制仅具有“投影”(即过滤器)的给定字段的子文档的方法?的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb学习

具有特定条件计数的 Mongodb 聚合并按输出投影的日期范围过滤不能按预期工作

如何仅在给定帧中限制 UIWebView 中的视频播放

如何获取在其半径内包含给定位置的记录?蒙古数据库

为啥 Oracle SDO 可以投影具有北轴承但不能用东轴承的点?

是否可以在具有 $elemMatch 投影的同一集合上使用查询投影?