Arrays 在MongoDB 3.2中使用aggregate,并基于值数组使用$lookup进行匹配
我在名为Arrays 在MongoDB 3.2中使用aggregate,并基于值数组使用$lookup进行匹配,arrays,mongodb,mongodb-query,aggregation-framework,Arrays,Mongodb,Mongodb Query,Aggregation Framework,我在名为foos的集合中有一个MongoDB 3.2文档。该文档如下所示: { _id: "foo1", fooProp: "some prop" barKey: ["key1","key2"] } { _id: "bar1", barKey: "key1", barProp: "some prop 2" }, { _id: "bar2", barKey: "key2", barProp: "some prop 3" } 我想使用aggregate函数和$
foos
的集合中有一个MongoDB 3.2文档。该文档如下所示:
{
_id: "foo1",
fooProp: "some prop"
barKey: ["key1","key2"]
}
{
_id: "bar1",
barKey: "key1",
barProp: "some prop 2"
},
{
_id: "bar2",
barKey: "key2",
barProp: "some prop 3"
}
我想使用aggregate
函数和$lookup
将此文档与另一个名为bar
的集合中的两个其他文档通过其barKey
字段连接起来。这两个文档如下所示:
{
_id: "foo1",
fooProp: "some prop"
barKey: ["key1","key2"]
}
{
_id: "bar1",
barKey: "key1",
barProp: "some prop 2"
},
{
_id: "bar2",
barKey: "key2",
barProp: "some prop 3"
}
因此foo
文档的barKey
数组中的字符串都与具有相同barKey
值的bar
文档相匹配
最初,我使用的是MongoDB 3.4,我能够使用这个简单的查询来获得所需的结果:
//mongo 3.4 query (working)
db.foos
.aggregate([
{
$lookup: {
from: "bars",
localField: "barKey",
foreignField: "barKey",
as: "barData"
}
}
])
结果(这是理想结果)如下所示:
//mongo 3.4 ideal result
{
_id: "foo1",
fooProp: "some prop"
barKey: ["key1","key2"],
barData: [
{
_id: "bar1",
barKey: "key1",
barProp: "some prop 2"
},
{
_id: "bar2",
barKey: "key2",
barProp: "some prop 3"
}
]
}
但是,在MongoDB 3.2中,同样的查询会为barData
生成一个空数组[]
我为barKey
数组添加了$unwind
步骤:
//mongo 3.2 query (partly working)
db.foos
.aggregate([
{ $unwind: "$bldgKey" },
{
$lookup: {
from: "bars",
localField: "barKey",
foreignField: "barKey",
as: "barData"
}
}
])
…这部分起作用,但现在结果是foos
集合中的每个文档都有来自bar
集合的重复文档,而不是将bar
文档嵌套在单个foos
文档中:
//mongo 3.2 less-than-ideal result
{
_id: "foo1",
fooProp: "some prop"
barKey: ["key1","key2"],
barData: [
{
_id: "bar1",
barKey: "key1",
barProp: "some prop 2"
}
]
},
{
_id: "foo1",
fooProp: "some prop"
barKey: ["key1","key2"],
barData: [
{
_id: "bar2",
barKey: "key2",
barProp: "some prop 3"
}
]
}
在Mongo 3.2中,使用更简单的查询获得理想结果的最佳方法是什么?
如果我使用$group
,我希望不必列出结果中需要的每个字段,只要从文档中不可知地获取所有字段(如果可能)。我在这里给出的foobar示例是一个简化的现实世界文档示例,每个文档都包含几十个不同的字段,这些字段可能因文档而异