MongoDB的。 限制只有“投影”(即filter)给定字段的子文档的方法?

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

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

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

(想象一下,当你有一千个不同的模式的子目录时,我做了一个.find()并获得了1000个子目录,但是有900个是空的,我只想得到100,所以我不一定要处理在MongoDB之外的空白的。)

例如,您有一个collection named mondaycollection 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仍然返回,虽然是空的。

我相信在这种情况下返回空字段,因为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是没有必要的,它只是加快处理,如果有很多没有你正在寻找的子文档的文档。