如何查询和显示每个mongodb记录的数组中的字段?

时间:2017-05-20 14:25:35

标签: mongodb

我在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
}

我已阅读有关群组的文档,但不确定如何编写查询以获得上述格式的结果?

1 个答案:

答案 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
    }
}])