【发布时间】:2015-09-12 12:48:35
【问题描述】:
我在 MongoDB 中有一个文档集合,其中每个文档都有一个包含数组的子文档。
{
_id: <id>
key1: "value1",
key2: "value2",
...
versions: [
{ version: 2, key1: <othervalue2>, key2: <othervalue2>}
{ version: 1, key1: <othervalue2>, key2: <othervalue2>}
]
}
我想查询集合并返回包含所有字段的文档,以及与某些参数匹配的数组元素(或当不匹配时为空数组)。使用我当前的代码,只有当数组中至少有一个元素匹配时,我才能得到结果。
我正在使用这些参数进行聚合:
{$match: {_id: <someID>}},
{$unwind: '$versions'},
{$match: {'versions.version': {$gte: <version>}}},
{$group: {_id: '$_id', key1: {$first: '$key1'}, ..., 'versions': {$push: '$versions'}}
例如,查询 arrayelement.version >= 2 应该返回的位置(这适用于当前代码):
{
_id: <id>
key1: "value1",
key2: "value2",
...
versions: [
{ version: 2, key1: <othervalue2>, key2: <othervalue2>}
]
}
并查询 arrayelement.version >= 4 应该返回的位置:
{
_id: <id>
key1: "value1",
key2: "value2",
...
versions: []
}
我见过的解决方案都没有解决即使数组为空也返回对象的问题。这甚至可能吗?
【问题讨论】:
-
您的
$match聚合不满足条件。因此,在空数组的情况下它不会返回任何结果 -
@gypsyCoder 实际上
$unwind会忽略空数组,因此这些文档永远不会到达第二个$match。
标签: mongodb aggregation-framework