因为mongodb中没有过滤子文档的方法(参考:How to select subdocuments with MongoDB
MongoDB中是否有另一种方法/方法可以快速删除/筛选没有给定字段、在下面的示例中没有subdocument字段的字段?
唯一的方法是在MongoDB之外处理结果并过滤掉所有空文档吗?
(想象一下这样一种情况:您有1000个子文档,它们的模式各不相同。我执行a.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" },
    {    }
    ] }

您看到另一个_字段仍然返回,尽管是空的。

最佳答案

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

09-26 22:31
查看更多