2

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

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

通过在 mongodb之外处理结果并过滤掉所有空文档来做到这一点的唯一方法是什么?

(想象一下当你有一千个具有不同模式的子文档的情况。我做了一个 .find() 并得到 1000 个子文档,但 900 个是空的。我只想得到 100 个,所以我不必总是处理和将空的放在 MongoDB 之外。)

例如,您有这个 JSON,它位于collection named 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 尽管为空,但仍然返回。

4

1 回答 1

2

我相信在这种情况下会返回空字段,因为 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不是必需的,如果有很多文档没有您要查找的任何子文档,它只会加快处理速度。

于 2013-05-27T17:05:54.490 回答