如果一个字段匹配则合并记录,但如果另一个字段在两个记录中都有值则不合并 MongoDb 聚合

Merge records if one field matches, but not if another field has values in both records MongoDb aggregation

我有一些记录,例如:

{
id: 1,
phone: "+15555555555",
name: "Acme CO.",
vendorcode: "ACMEC"
},
{
id: 2,
phone: "+15555555555",
name: "Acme corporation company",
vendorcode: "ACMECOMPANY"
},
{
id: 3,
phone: "+15555555555",
name: "Acme Incorporated",
vendorcode: null
}

我要合并记录:

IF phone 字段匹配,合并记录。 (可以用要合并的下一条记录的值覆盖值)。

但如果多个记录中有 vendorcode non-null 个值,则创建一个值数组。所以新记录中的“vendorcode”将是一个数组。

我希望上述 collection 的输出类似于:

{
phone: "+15555555555",
name: "Acme Co.",
vendorcode: ["ACMEC","ACMECOMPANY"]
}

在新 collection.

如何在 mongodb 中为此编写聚合?

  • $groupphone、select 首先 namephone
  • $ifNull 将 return vendorcode 如果它不为 null
  • $addToSet 使数组唯一 vendorcode
  • $project 删除 _id 字段
  • $out to write query result in new collection,这将创建一个新的集合并写入这个查询结果
db.collection.aggregate([
  {
    $group: {
      _id: "$phone",
      phone: { $first: "$phone" },
      name: { $first: "$name" },
      vendorcode: {
        $addToSet: { $ifNull: ["$vendorcode", "$$REMOVE"] }
      }
    }
  },
  { $project: { _id: 0 } },
  { $out: "newCollectionName" }
])

Playground