duplicados Mongo Eliminar en matriz de objetos sobre la base de campo

Chacmool:

Nuevo en Mongo, han encontrado muchos ejemplos de la eliminación de duplicados de matrices de cadenas utilizando el marco de la agregación, pero me pregunto si es posible para eliminar duplicados de matriz de objetos basados ​​en un campo en el objeto. P.ej

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

Aquí me gustaría para eliminar duplicados basados en el idcampo. Así terminaría con

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

Recogiendo el primero / cualquier objeto con obras identificador dado. Sólo quiero terminar con uno por ID. Es esto factible en el marco de la agregación? O incluso la agregación marco exterior, sólo en busca de una forma limpia de hacer esto. Necesidad de hacer este tipo de cosas en otros documentos de la colección, que parece un caso de uso bueno para la agregación de marco, pero como he mencionado, novato aquí ... gracias.

Valijon:

Así, es posible obtener el resultado deseado de 2 maneras.

Clásico

Aplanan - duplicados Retire (seleccionado en la primera ocurrencia) - Grupo de

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

Moderno

Tenemos que utilizar $ reducir el operador.

pseudocódigo:

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

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=377253&siteId=1
Recomendado
Clasificación