MongoDB以一对多关系显示子项
这是1:N关系的示例。 有一个根项,它由几个项(子项)组成: 我要做的是显示根项中的子项数据:MongoDB以一对多关系显示子项,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,这是1:N关系的示例。 有一个根项,它由几个项(子项)组成: 我要做的是显示根项中的子项数据: { "dates": "1399518702000", "numbers": "5982", "goals": "1", "durations: "78" }, { "dates": "1399126333000", "numbers": "5983", "goals": "0", "durations": "45" }, { "
{
"dates": "1399518702000",
"numbers": "5982",
"goals": "1",
"durations: "78"
},
{
"dates": "1399126333000",
"numbers": "5983",
"goals": "0",
"durations": "45"
},
{
"dates": "1399209192000",
"numbers": "5984",
"goals": "4",
"durations": "90"
},
{
"dates": "1399027545000",
"numbers": "5985",
"goals": "2",
"durations": "90"
}
在表中,结构如下所示:
根项目:
name number
J. Evans 4
儿童用品
dates numbers goals durations
1399518702000 5982 1 78
1399126333000 5983 0 45
1399209192000 5984 4 90
1399027545000 5985 2 90
我正在尝试使用$unwind
运算符执行此情况:
db.coll.aggregate([{ $unwind: "dates" }, { $unwind: "numbers" }, { $unwind: "goals" }, { $unwind: "durations"} ])
但查询没有给出预期的数据:/
是一个很好的解决方案,但只适用于两个阵列。下面的管道应该会告诉您这个想法
db.getCollection('yourCollection').aggregate(
{
$unwind: {
path: "$dates",
includeArrayIndex: "idx"
}
},
{
$project: {
_id: 0,
dates: 1,
numbers: { $arrayElemAt: ["$numbers", "$idx"] },
goals: { $arrayElemAt: ["$goals", "$idx"] },
durations: { $arrayElemAt: ["$durations", "$idx"] }
}
}
)
为您的示例生成以下输出
/* 1 */
{
"dates" : NumberLong(1399518702000),
"numbers" : "5982",
"goals" : "1",
"durations" : "78"
}
/* 2 */
{
"dates" : NumberLong(1399126333000),
"numbers" : "5983",
"goals" : "0",
"durations" : "45"
}
/* 3 */
{
"dates" : NumberLong(1399209192000),
"numbers" : "5984",
"goals" : "4",
"durations" : "90"
}
/* 4 */
{
"dates" : NumberLong(1399027545000),
"numbers" : "5985",
"goals" : "2",
"durations" : "90"
}
/* 1 */
{
"dates" : NumberLong(1399518702000),
"numbers" : "5982",
"goals" : "1",
"durations" : "78"
}
/* 2 */
{
"dates" : NumberLong(1399126333000),
"numbers" : "5983",
"goals" : "0",
"durations" : "45"
}
/* 3 */
{
"dates" : NumberLong(1399209192000),
"numbers" : "5984",
"goals" : "4",
"durations" : "90"
}
/* 4 */
{
"dates" : NumberLong(1399027545000),
"numbers" : "5985",
"goals" : "2",
"durations" : "90"
}