蒙古数据库。限制仅具有“投影”(即过滤器)的给定字段的子文档的方法?
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 聚合并按输出投影的日期范围过滤不能按预期工作