因为无法过滤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" },
{ }
] }
你看到另一个字段仍然返回,尽管它是空的。
答案 0 :(得分: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
不是必需的,如果有很多文档没有您要查找的任何子文档,它只会加快处理速度。