mongo db集合中的重复元素

时间:2018-01-22 19:12:16

标签: mongodb spring-boot

是否有一种快速有效的方法可以根据属性复制mongo db集合中的元素。在下面的示例中,我尝试基于jobId复制元素。 我正在使用Spring启动,因此任何使用Spring启动API的示例都会更有帮助。

Original Collection

{ _id: 1, jobId: 1, product: "A"},
{ _id: 2, jobId: 1, product: "B"},
{ _id: 3, jobId: 1, product: "C"},

重复后

{ _id: 1, jobId: 1, product: "A"},
{ _id: 2, jobId: 1, product: "B"},
{ _id: 3, jobId: 1, product: "C"},
{ _id: 4, jobId: 2, product: "A"},
{ _id: 5, jobId: 2, product: "B"},
{ _id: 6, jobId: 2, product: "C"},

1 个答案:

答案 0 :(得分:1)

您可以使用以下聚合:

db.col.aggregate([
    {
        $group: {
            _id: null,
            values: { $push: "$$ROOT" }
        }
    },
    {
        $addFields: {
            size: { $size: "$values" },
            range: { $range: [ 0, 3 ] }
        }
    },
    {
        $unwind: "$range"
    },
    {
        $unwind: "$values"
    },
    {
        $project: {
            _id: { $add: [ "$values._id", { $multiply: [ "$range", "$size" ] } ] },
            jobId: { $add: [ "$values.jobId", "$range" ] },
            product: "$values.product",
        }
    },
    {
        $sort: {
            _id: 1
        }
    },
    {
        $out: "outCollection"
    }
])

这里的算法很简单:我们想迭代两组:

  • 第一个由您的源集合中的所有项目定义的(这就是我为什么要归零的原因)
  • 第二个由$range运算符人工定义。它将定义我们想要将我们的集合乘以的次数(在此示例中为3次)

Double unwind生成尽可能多的文档。然后,每个_id的公式如下:_id = _id + range * size。最后一步是将聚合输出重定向到您的集合。