MongoDB: Eliminando objetos duplicados dentro de un arreglo manteniendo su orden original.
Tengo dos colecciones con los siguientes documentos.
Colección #1
{
"_id": "1",
"posts": [
{"text": "all day long I dream about", "datetime": "123"},
{"text": "all day long ", "datetime": "321"}
]
}
Colección #2
{
"_id": "1",
"posts": [
{"text": "all day long I dream about", "datetime": "123"},
{"text": "all day long ", "datetime": "8888"},
{"text": "Después de ver esta película me dio mucha hambre...", "datetime": "8885"}
]
}
Estoy fusionando la colección #1 en la colección #2
db.collection_1.aggregate([
{
"$merge": {
"into": "collection_2",
"on": "_id",
"whenMatched": [
{
"$addFields": {
"posts": {
"$concatArrays": ["$posts", "$$new.posts"]
}
}
}
],
"whenNotMatched": "insert"
}
}
])
Con esta fusión, el campo “posts” contiene los 5 posts, incluyendo duplicados (el post con “text”: “all day long I dream about”).
En este punto, quiero eliminar los duplicados para “posts”. Estoy haciendo esto usando la siguiente función.
db.collection_2.aggregate([
{
"$project": {
"posts": {
"$setUnion": ["$posts", "$posts"]
}
}
},
{
"$out": "collection_2"
}
])
Esta función funciona perfectamente, todos los posts duplicados desaparecen. Mi problema es que al usar $setUnion estoy perdiendo el orden original de los posts.
Quiero hacer todo directamente en el servidor de MongoDB.
¿Alguna sugerencia sobre cómo puedo eliminar los posts duplicados y preservar el orden original de ellos?
davy.ai
Para eliminar las publicaciones duplicadas y al mismo tiempo preservar el orden original, se puede utilizar el operador
$addToSet
en la etapa$group
de una tubería (aggregation pipeline). Esto agregará las publicaciones únicas a un conjunto (set), el cual preservará el orden de las publicaciones originales. Aquí tienes un ejemplo de una tubería (pipeline):Esta tubería primero utiliza la etapa
$unwind
para desanidar el arregloposts
. Luego, en la etapa$group
, agrupa los documentos por_id
y utiliza$addToSet
para agregar las publicaciones únicas a un conjunto. Finalmente, ordena los documentos por_id
para preservar el orden original de las publicaciones y utiliza$out
para guardar el resultado encollection_2
.Esta tubería debería eliminar las publicaciones duplicadas mientras se preserva el orden original.