PHP-MongoDB:使用数组中的字段名称从子文档中检索字段

时间:2018-12-10 20:11:52

标签: php mongodb

考虑数组

$lettersArray = [A,C,E,G]

我的MongoDB集合具有以下结构。

{
    Collection : {
        letters:{
            A:{...},
            B:{...},
            ...
            Z:{...}
        }

    }
}

请考虑,Letter Sub文档是较大集合的一部分。因此,我正在使用聚合。 现在,我已经尝试投影-

['$Collection.letters' => ['$elemMatch' => ['$in' => $lettersArray]]

也尝试过

['Letters' => ['$in' => [$lettersArray,'$Collection.letters']]

但这没用。

最后,我希望得到如下结果:

 [
     Collection => [
        letters => [
            A => [...],
            C => [...],
            E => [...],
            G => [...]
        ]
    ]
]

有什么办法吗?

2 个答案:

答案 0 :(得分:0)

在PHP中,您可以将array_combine与array_fill一起使用以创建空数组。

$lettersArray = ['A','C','E','G'];

$letters = array_combine($lettersArray, array_fill(0,count($lettersArray), []));

Array_fill创建一个从索引0到$ lettersArray中内容为[]的项目计数的数组

输出:

array(4) {
  ["A"]=>
  array(0) {
  }
  ["C"]=>
  array(0) {
  }
  ["E"]=>
  array(0) {
  }
  ["G"]=>
  array(0) {
  }
}

https://3v4l.org/TeoFv

答案 1 :(得分:0)

我认为您在尝试访问文档信息时出错。

如果查看您的MongoDB文档,您会发现它实际上不是数组,因此不应使用UnknownWebservice来投影这些字段,而应使用简单的投影。对于您的情况,您应该以这种方式进行投影:

$elemMatch

顺便说一句,您不需要使用聚合框架来计算这样的投影。您可以只使用[ '$project' => [ 'Collection.letters.A' => 1, 'Collection.letters.C' => 1, 'Collection.letters.E' => 1, 'Collection.letters.G' => 1 ] ] ,并在选项中使用投影,这是函数的第二个参数:

find()

干杯

查尔斯