MongoDB文档合并无需字段先验知识

pqwbnv8z  于 2023-01-25  发布在  Go
关注(0)|答案(1)|浏览(169)

我想合并几个文档。大多数字段具有相同的值,但可能有一两个字段具有不同的值。这些字段事先是未知的。理想情况下,我想合并所有文档,使字段保持不变,但只为那些具有某些变化的字段创建一个值数组。
对于我的第一种方法,我按文档的公共字段进行分组,并保留第一个文档,但这会丢弃其他字段中的一些信息。

group_documents = {
         "$group": {
           "_id": "$0020000E.Value",
           "doc": {
             "$first": "$$ROOT"
           }
         }
     }
   

     merge_documents = {
         "$replaceRoot": {
           "newRoot": "$doc"
         }
     }

     write_collection = { "$out": { "db": "database", "coll": "records_nd" } }

    objects = coll.aggregate(pipeline)

如果已知字段具有不同的值,我会执行类似的操作,
merge_sol1merge_sol2merge_sol3
第三个解决方案实际上非常接近我想要的输出,我可以稍微调整一下,但是这些答案假设了要合并的字段的先验知识。

qmb5sa22

qmb5sa221#

可以先将所有字段按$addToSet进行$group运算,先将所有不同的值放入一个数组中,然后检查结果数组的大小,如果数组大小为1(即该字段中所有单据的值都相同),则有条件地挑第一项;否则,保留结果数组。

db.collection.aggregate([
  {
    "$group": {
      "_id": "$key",
      "a": {
        "$addToSet": "$a"
      },
      "b": {
        "$addToSet": "$b"
      }
    }
  },
  {
    $set: {
      "a": {
        "$cond": {
          "if": {
            $gt: [
              {
                $size: "$a"
              },
              1
            ]
          },
          "then": "$a",
          "else": {
            $first: "$a"
          }
        }
      },
      "b": {
        "$cond": {
          "if": {
            $gt: [
              {
                $size: "$b"
              },
              1
            ]
          },
          "then": "$b",
          "else": {
            $first: "$b"
          }
        }
      }
    }
  }
])

Mongo Playground

相关问题