sql >> Base de Datos >  >> NoSQL >> MongoDB

Reformar matriz almacenada en una colección y exportar a CSV

Puede lidiar con esto de varias maneras.

En primer lugar, si tiene MongoDB 3.4 disponible, entonces podría usar "View" para representar la colección con el contenido de la matriz "desenrollado". Una "Vista" es básicamente una declaración de tubería de agregación que parece ser una colección normal en lo que respecta a la mayoría de las acciones que usarían una colección.

Suponiendo que su colección de origen se llame "pages" aquí, entonces crearía la "Vista" con:

db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])

Luego puede consultar la colección como de costumbre:

db.pageArray.find()

/* 1 */
{
    "_id" : ObjectId("4725bf8731b8faf4c04595bb"),
    "user_id" : "0939bf9w9804842f9f817ad100",
    "page_likes" : {
        "id" : "859302873383",
        "name" : "Hotdogs"
    }
}

/* 2 */
{
    "_id" : ObjectId("4725bf8731b8faf4c04595bb"),
    "user_id" : "0939bf9w9804842f9f817ad100",
    "page_likes" : {
        "id" : "8593683902",
        "name" : "Video Games"
    }
}

/* 3 */
{
    "_id" : ObjectId("4725bf8731b8faf4c04595bb"),
    "user_id" : "0939bf9w9804842f9f817ad100",
    "page_likes" : {
        "id" : "849204859849028",
        "name" : "Road Bikes"
    }
}

Y posteriormente emita el mongoexport como si fuera una colección normal:

mongoexport -d test -c pageArray --type=csv --fields user_id,page_likes.id,page_likes.name
2017-07-05T13:14:11.588+1000    connected to: localhost
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes
2017-07-05T13:14:11.589+1000    exported 3 records

Por supuesto, agregar --out o una redirección estándar para generar un archivo.

Si su MongoDB es una versión anterior pero al menos tiene $out disponible (de MongoDB 2.6) luego escriba en otra colección:

db.pages.aggregate([
  { "$unwind": "$page_likes" },
  { "$project": { "_id": 0 } },
  { "$out": "pagesArray" }
])

Entonces básicamente ejecutas el mismo mongoexport como arriba, ya que también es una colección a la que se puede acceder para hacerlo.

Si realmente no desea crear una "Vista" u "otra colección", simplemente puede enviar un breve script a mongo caparazón. Aunque de una manera muy hacky:

mongo --quiet --eval '
    print("user_id,page_likes.id,page_likes.name");
    db.pages.aggregate([ 
      { "$unwind": "$page_likes" },
      { "$project": { "_id": 0 } },
    ]).forEach(p => print(`${p.user_id},${p.page_likes.id},${p.page_likes.name}`))'

O incluso sin aggregate() y $unwind en absoluto:

mongo --quiet --eval '
    print("user_id,page_likes.id,page_likes.name");
    db.pages.find({},{ _id: 0 }).forEach(p =>
       p.page_likes.forEach(l => print(`${p.user_id},${l.id},${l.name}`)))'

Lo que te da el mismo resultado:

user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes

Tenga en cuenta también que si desea o "necesita" un delimitador diferente a la coma , aquí, entonces cualquiera de los dos últimos enfoques con el caparazón es probablemente el camino a seguir. Como esto está "programado" para agregar a mongoexport y mongoimport con HERRAMIENTAS-87 , pero por supuesto está "todavía por resolver". Entonces, si desea un resultado diferente, hágalo usted mismo.