使用MongoDB 3.2中的聚合与$ lookup匹配基于值数组

时间:2018-03-21 04:53:02

标签: arrays mongodb mongodb-query aggregation-framework

我在名为foos的集合中有一个MongoDB 3.2文档。该文件如下:

{
  _id: "foo1",
  fooProp: "some prop"
  barKey: ["key1","key2"]
}

我希望aggregate函数与$lookup一起使用bars字段将此文档与另一个名为barKey的集合中的另外两个文档相关联。这两个文件看起来像这样:

{
  _id: "bar1",
  barKey: "key1",
  barProp: "some prop 2"
},
{
  _id: "bar2",
  barKey: "key2",
  barProp: "some prop 3"
}

因此,barKey文档的foo数组中的字符串均与具有相同bar值的barKey文档匹配。

最初,我使用的是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

我为$unwind数组添加了barKey步骤:

//mongo 3.2 query (partly working)

db.foos
  .aggregate([
    { $unwind: "$bldgKey" },
    {
      $lookup: {
        from: "bars",
        localField: "barKey",
        foreignField: "barKey",
        as: "barData"
      }
    }
  ])

...部分有效,但现在结果为foos集合中bars集合中的每个文档都有重复的文档,而不是将bars文档嵌套在一个文档中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中使用更简单的查询获得Mongo 3.4中理想结果的最佳方式是什么?

如果我使用$group,我宁愿不必在结果中列出我想要的每个字段,如果可能的话,只需从文档中获取所有字段。我在这里给出的foo-bar示例是现实世界文档的简化示例,每个文档都包含许多不同的字段,这些字段可能因文档而异。

0 个答案:

没有答案