sql >> Databáze >  >> NoSQL >> MongoDB

Změňte tvar pole, které je uloženo v kolekci, a exportujte do CSV

Můžete se s tím vypořádat mnoha způsoby.

Za prvé, pokud máte k dispozici MongoDB 3.4, můžete použít "Zobrazit" za účelem reprezentovat kolekci s obsahem pole "un-wound". "View" je v podstatě příkaz agregačního kanálu, který se zdá být normální sbírkou, pokud jde o většinu akcí, které by používaly kolekci.

Za předpokladu, že se vaše zdrojová kolekce nazývá "pages" zde, pak byste vytvořili "View" pomocí:

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

Poté se můžete dotázat na kolekci jako obvykle:

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"
    }
}

A následně vydejte mongoexport jako by to byla normální sbírka:

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

Samozřejmě přidání --out nebo standardní přesměrování na skutečný výstup do souboru.

Pokud je vaše MongoDB starší verze, ale má alespoň $out k dispozici (od MongoDB 2.6), poté napište do jiné kolekce:

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

Pak v podstatě spustíte stejný mongoexport jako výše, protože je to také sbírka, která je k tomu přístupná.

Pokud opravdu nechcete vytvářet ani „Zobrazit“ ani „jinou sbírku“, můžete jednoduše poslat krátký skript do mongo skořápka. I když velmi otřepaným způsobem:

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}`))'

Nebo dokonce bez aggregate() a $unwind vůbec:

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}`)))'

Což vám dává stejný výstup:

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

Všimněte si také, že pokud chcete nebo "potřebujete" jiný oddělovač než čárka , Zde je pravděpodobně správnou cestou jeden ze dvou posledních přístupů s shellem. Protože toto je „naplánováno“ pro přidání do mongoexport a mongoimport s TOOLS-87 , ale samozřejmě je "ještě k vyřešení". Pokud tedy chcete jiný výstup, udělejte to sami.




  1. Výjimka Mongo CursorTimeout

  2. Jak mám uložit pole v redis?

  3. MongoDB $mod

  4. Nastavte klíč předpony mezipaměti Redis na Symfony