mongodb - Mongo 根据字段删除对象数组中的重复项

标签 mongodb aggregation-framework

Mongo 的新手,发现了很多使用聚合框架从字符串数组中删除重复项的示例,但我想知道是否可以根据对象中的字段从对象数组中删除重复项。例如

{
"_id" : ObjectId("5e82661d164941779c2380ca"),
"name" : "something",
"values" : [
    {
        "id" : 1,
        "val" : "x"
    },
    {
        "id" : 1,
        "val" : "x"
    },
    {
        "id" : 2,
        "val" : "y"
    },
    {
        "id" : 1,
        "val" : "xxxxxx"
    }
]
}

在这里,我想根据 id 删除欺骗者 field 。所以最终会
{
"_id" : ObjectId("5e82661d164941779c2380ca"),
"name" : "something",
"values" : [
    {
        "id" : 1,
        "val" : "x"
    },
    {
        "id" : 2,
        "val" : "y"
    }
]
}

选择具有给定 id 的第一个/任何对象。只想最终每个 id 一个。这在聚合框架中可行吗?甚至在聚合框架之外,只是寻找一种干净的方法来做到这一点。需要在集合中的许多文档中执行此类操作,这似乎是聚合框架的一个很好的用例,但正如我所提到的,这里是新手...谢谢。

最佳答案

好吧,您可以通过 2 种方式获得所需的结果。
经典的
展平 - 删除重复项(选择第一个出现) - 分组依据

db.collection.aggregate([
  {
    $unwind: "$values"
  },
  {
    $group: {
      _id: "$values.id",
      values: {
        $first: "$values"
      },
      id: {
        $first: "$_id"
      },
      name: {
        $first: "$name"
      }
    }
  },
  {
    $group: {
      _id: "$id",
      name: {
        $first: "$name"
      },
      values: {
        $push: "$values"
      }
    }
  }
])
MongoPlayground
现代的
我们需要使用 $reduce运算符(operator)。
伪代码:
values : {
  var tmp = [];
  for (var value in values) {
      if !(value.id in tmp)
        tmp.push(value);
  }
  return tmp;
}
db.collection.aggregate([
  {
    $addFields: {
      values: {
        $reduce: {
          input: "$values",
          initialValue: [],
          in: {
            $concatArrays: [
              "$$value",
              {
                $cond: [
                  {
                    $in: [
                      "$$this.id",
                      "$$value.id"
                    ]
                  },
                  [],
                  [
                    "$$this"
                  ]
                ]
              }
            ]
          }
        }
      }
    }
  }
])
MongoPlayground

关于mongodb - Mongo 根据字段删除对象数组中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60954387/

相关文章:

mongodb - 如何使用 Mongodb 进行聚合分组并显示其他字段?

mongodb 在每个文档中找到三个键的最旧日期

mongodb - 如何在 $nearSphere 查询中使用 $maxDistance 的文档属性?

javascript - 如何从一系列捐赠中返回每个独特捐赠类别的总计?

mongodb - 比较在 Mongodb 中存储为字符串的整数

node.js - 是否建议在 AWS 上的 Ubuntu 实例上安装 MongoDB?

javascript - mongodb 注入(inject)的可能性

MongoDB 对特定嵌套属性的投影

javascript - mongodb不插入完整数组

javascript - 按日期与MongoDB中的本地时区分组