mongodb 如何合并两个集合,并让结果结束在用户定义的字段?

2izufjch  于 2022-12-12  发布在  Go
关注(0)|答案(1)|浏览(113)

假设我有两个集合:一个主集合和一个包含 meta数据的集合。元数据包含我不想在主集合中包含的其他(易失性)数据。
接下来我想做的是将这些 meta数据与主集合合并。这是可能的,因为它们都使用相同的_id。但是,我不希望所有元数据都在主文档中结束,我希望在名为meta的字段中结束。如下所示:

// Main record
{
  _id: 1234,
  varA: "foo",
  varB: "bar"
}

// Meta record
{
  _id: 1234,
  metaA: "cafe",
  metaB: "babe"
}

合并应该以

// Merged record
{
  _id: 1234,
  varA: "foo",
  varB: "bar",
  meta:
  { 
    metaA: "cafe",
    metaB: "babe"
  }
}

显然,我可以手动迭代所有文档并自己合并它们,但这很慢,我相信这可以通过使用聚合阶段来解决。
我已经试过$merge的各种选择,都无济于事。如果有人有主意,请告诉我。
谢谢你!

hwamh0ep

hwamh0ep1#

我已经试过$merge的各种选择,都无济于事。如果有人有主意,请告诉我。
如果我对情况的理解正确的话,$merge阶段中并没有直接实现您的目标的内置选项,相反,这里的解决方案将是在$merge本身之前,通过聚合中的前几个阶段来塑造数据。
具体来说,您当前拥有的meta记录如下所示:

{
  _id: 1234,
  metaA: "cafe",
  metaB: "babe"
}

为了直接使用$merge,您需要它看起来更像这样:

{ 
  _id: 1234, 
  meta: { 
    metaA: 'cafe', 
    metaB: 'babe' 
  } 
}

这样的转换可以通过管道来实现,例如:

[
  { $addFields: {meta:'$$ROOT'} },
  { $unset:'meta._id' }, 
  { $project:{_id:1, meta:1} }
]

将它们放在一起并追加$merge(带有默认值),将根据需要对main集合中的文档进行更改:

> db.main.find()
[ 
  { _id: 1234, varA: 'foo', varB: 'bar' } 
]
> db.meta.find()
[ 
  { _id: 1234, metaA: 'cafe', metaB: 'babe' } 
]
> db.meta.aggregate([
  {$addFields:{meta:'$$ROOT'}},
  {$unset:'meta._id'}, 
  {$project:{_id:1, meta:1}},
  {$merge:{into:'main'}}
])

> db.main.find()
[
  {
    _id: 1234,
    varA: 'foo',
    varB: 'bar',
    meta: { metaA: 'cafe', metaB: 'babe' }
  }
]

相关问题