我在mongo数据库中有以下数据
{
"_id": "100",
"Color": "Green",
"data":[{"Name":"John"}]
}
{
"_id": "101",
"Color": "Green",
"data":[{"Name":"Andy"}]
}
{
"_id": "102",
"Color": "Blue",
"data":[{"Name":"Paul"}]
}
{
"_id": "103",
"Color": "Blue",
"data":[{"Name":"Jimi"}]
}
{
"_id": "104",
"Color": "Blue",
"data":[{"Name":"Lucy"}]
}
{
"_id": "105",
"Color": "Red",
"data":[{"Name":"Aron"}]
}
我想检索一组结果如下,其中每个名称'在数组中显示为1对1的颜色'颜色'字段。
{
"Color": "Green", "Name": John
"Color": "Green", "Name": Andy
"Color": "Blue", "Name": Paul
"Color": "Blue", "Name": Jimi
"Color": "Blue", "Name": Lucy
"Color": "Red", "Name": Aron
}
我已阅读有关群组的文档,但不确定如何编写查询以获得上述格式的结果?
答案 0 :(得分:0)
好的,你想先做这个查询
db.getCollection('test').aggregate([
{
$project: {_id: 0, Color: 1, Name: "$data.Name"} //_id field is included by default and we need to supress it
},
{
$unwind: "$Name" //without this the Name will be embedded
},
{
$sort: {
"Color": 1
}
}])
在这里,我们首先传递带有 $ project 的Color和Name的文档。
由于Name位于数据数组中,因此它嵌入在对象中,因此我们使用 $ unwind 对其进行解构。这将使其成为顶级财产。 请注意,如果数据有多个项目,它将“解除”所有项目。
最后,我们将使用 $ sort 根据颜色对数据进行排序。
这有帮助吗?
Neil Lunn发表评论后的更新
正如Neil指出的那样,因为我们在数组中只有1个元素。我们可以使用$arrayElemAt,我们不必拥有$ unwind管道阶段。
以下是更新后的代码
db.getCollection('test').aggregate([
{
$project: {_id: 0, Color: 1, Name: {$arrayElemAt: ["$data.Name", 0]}} //_id field is included by default and we need to supress it
},
{
$sort: {
"Color": 1
}
}])