Mongodb 聚合使用文档字段作为数组结果的键而不是增量数字
Mongodb aggregation use document field as key for array result instead of incremental numbers
我的聚合在 mongodb 查询中给我这个结果
{"_id" : 1, "color" : "red", "year" : 2019},
{"_id" : 2, "color" : "blue", "year" : 2018},
{"_id" : 3, "color" : "green", "year" : 2020}
在 php 中我得到这样的结果:
array(3) {
[0] => array(3) {
["_id"] => int(1),
["color"] => string(3) "red"
["year"] => int(2019),
},
[1] => array(3) {
["_id"] => int(2),
["color"] => string(4) "blue"
["year"] => int(2018),
},
[2] => array(3) {
["_id"] => int(3),
["color"] => string(5) "green"
["year"] => int(2020),
}
}
我需要的是这样的:
array(3) {
["red"] => array(3) {
["_id"] => int(1),
["color"] => string(3) "red"
["year"] => int(2019),
},
["blue"] => array(3) {
["_id"] => int(2),
["color"] => string(4) "blue"
["year"] => int(2018),
},
["green"] => array(3) {
["_id"] => int(3),
["color"] => string(5) "green"
["year"] => int(2020),
}
}
所以换句话说,我想 return 文档结果作为一个数组,其中键作为每个文档的 $color。
我所做的是循环一次抛出结果并复制到一个新数组中,如下所示:
newArray = [];
foreach($query as $doc){
$newArray[$doc['color']] = $doc;
}
现在 newArray 具有我需要的结构,但我想直接从 mongo 实现它,这样 php 服务器端就不必在有数千个文档时完成工作。
听起来将这两个步骤添加到您的聚合中就可以完成这项工作:
{$group: {_id: 0, arr: {$push: {k: '$color', v: {_id: '$_id', color: '$color',
year: '$year'}}}}},
{$project: {res: {$arrayToObject: '$arr'}, _id: 0}}
返回:
{
"res" : {
"red" : {
"_id" : 1,
"color" : "red",
"year" : 2019
},
"blue" : {
"_id" : 2,
"color" : "blue",
"year" : 2018
},
"green" : {
"_id" : 3,
"color" : "green",
"year" : 2020
}
}
}
我的聚合在 mongodb 查询中给我这个结果
{"_id" : 1, "color" : "red", "year" : 2019},
{"_id" : 2, "color" : "blue", "year" : 2018},
{"_id" : 3, "color" : "green", "year" : 2020}
在 php 中我得到这样的结果:
array(3) {
[0] => array(3) {
["_id"] => int(1),
["color"] => string(3) "red"
["year"] => int(2019),
},
[1] => array(3) {
["_id"] => int(2),
["color"] => string(4) "blue"
["year"] => int(2018),
},
[2] => array(3) {
["_id"] => int(3),
["color"] => string(5) "green"
["year"] => int(2020),
}
}
我需要的是这样的:
array(3) {
["red"] => array(3) {
["_id"] => int(1),
["color"] => string(3) "red"
["year"] => int(2019),
},
["blue"] => array(3) {
["_id"] => int(2),
["color"] => string(4) "blue"
["year"] => int(2018),
},
["green"] => array(3) {
["_id"] => int(3),
["color"] => string(5) "green"
["year"] => int(2020),
}
}
所以换句话说,我想 return 文档结果作为一个数组,其中键作为每个文档的 $color。 我所做的是循环一次抛出结果并复制到一个新数组中,如下所示:
newArray = [];
foreach($query as $doc){
$newArray[$doc['color']] = $doc;
}
现在 newArray 具有我需要的结构,但我想直接从 mongo 实现它,这样 php 服务器端就不必在有数千个文档时完成工作。
听起来将这两个步骤添加到您的聚合中就可以完成这项工作:
{$group: {_id: 0, arr: {$push: {k: '$color', v: {_id: '$_id', color: '$color',
year: '$year'}}}}},
{$project: {res: {$arrayToObject: '$arr'}, _id: 0}}
返回:
{
"res" : {
"red" : {
"_id" : 1,
"color" : "red",
"year" : 2019
},
"blue" : {
"_id" : 2,
"color" : "blue",
"year" : 2018
},
"green" : {
"_id" : 3,
"color" : "green",
"year" : 2020
}
}
}