• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

346
Views
MongoDB: busque documentos con la aparición más temprana de valor duplicado

Tengo una colección dentro de MongoDB (4.4 pero la versión no es importante para mí) y uno de los valores del documento es una matriz de URL. Habrá varios documentos con varias URL por documento (dentro de la matriz) y algunas de esas URL ya existirán. Me gustaría seleccionar cada documento con la primera aparición de cada URL (la intención es marcarlo como el 'origen'.

Enlace de MongoPlayground para la colección de muestras: https://mongoplayground.net/p/ZAgCqr517-8

 { "title": "story1_first", "isoDate": "2022-01-01T00:00:00.000Z", "links": [ "www.first.com/article1", "www.anotherdomain.com" ] }, { "title": "story1_mention", "isoDate": "2022-01-10T00:00:00.000Z", "links": [ "www.first.com/article1", "www.somesite.com" ] }, { "title": "story2_first", "isoDate": "2022-01-20T00:00:00.000Z", "links": [ "www.newstory.com/article2", "www.anothercompany.com" ] }, { "title": "story2_mention", "isoDate": "2022-01-20T00:00:00.000Z", "links": [ "www.newstory.com/article2", "www.anothercompany.com" ] } ]

En este ejemplo, me gustaría que la consulta/agregación devuelva los dos documentos con "primero" en el título, ya que son los documentos que comparten una URL común dentro de los "enlaces" y son los documentos que tienen la fecha más antigua. Similar a cómo un motor de búsqueda clasifica un sitio dependiendo de cuántos otros sitios se vinculan a él.

about 3 years ago · Santiago Trujillo
1 answers
Answer question

0

Puede hacer lo siguiente en una canalización de agregación:

  1. $unwind links para que los documentos estén en el nivel de enlaces
  2. $sort on isoDate para obtener el primer documento
  3. $group por links para contar entre el grupo y la identificación del primer documento. En su ejemplo, el título se toma como identificador único.
  4. $match con el conteo > 1 para obtener un title que comparte el mismo enlace
  5. $group para deduplicar el identificador único que encontramos en el paso 3
  6. $lookup nuevo el documento original y hacer algunos cosméticos por $replaceRoot
 db.collection.aggregate([ { "$unwind": "$links" }, { $sort: { isoDate: 1 } }, { $group: { _id: "$links", first: { $first: "$title" }, count: { $sum: 1 } } }, { $match: { count: { $gt: 1 } } }, { $group: { _id: "$first" } }, { "$lookup": { "from": "collection", "localField": "_id", "foreignField": "title", "as": "rawDocument" } }, { "$unwind": "$rawDocument" }, { "$replaceRoot": { "newRoot": "$rawDocument" } } ])

Aquí está el parque infantil de Mongo para su referencia.

about 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error