MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Zmień kształt tablicy przechowywanej w kolekcji i eksportuj do CSV

Możesz sobie z tym poradzić na wiele sposobów.

Po pierwsze, jeśli masz dostęp do MongoDB 3.4, możesz użyć "Widoku" w celu reprezentowania kolekcji z zawartością tablicy "un-wound". „Widok” to w zasadzie instrukcja potoku agregacji, która wydaje się być normalną kolekcją, jeśli chodzi o większość działań, które używają kolekcji.

Zakładając więc, że Twoja kolekcja źródłowa nazywa się "pages" tutaj utworzysz „Widok” za pomocą:

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

Następnie możesz normalnie wysłać zapytanie do kolekcji:

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 następnie wydaj mongoexport jakby to była normalna kolekcja:

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

Oczywiście dodanie --out lub standardowe przekierowanie do rzeczywistego wyjścia do pliku.

Jeśli twoja MongoDB jest starszą wersją, ale przynajmniej ma $out dostępne ( z MongoDB 2.6 ), a następnie napisz do innej kolekcji:

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

Następnie w zasadzie uruchamiasz ten sam mongoexport jak powyżej, ponieważ jest to również dostępna kolekcja.

Jeśli naprawdę nie chcesz tworzyć „widoku” ani „kolejnej kolekcji”, możesz po prostu wysłać krótki skrypt do mongo powłoka. Choć w bardzo zwariowany sposób:

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

Lub nawet bez aggregate() i $unwind w ogóle:

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 daje ten sam wynik:

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

Pamiętaj też, że jeśli chcesz lub „potrzebujesz” innego separatora niż przecinek , tutaj, wtedy jedno z dwóch ostatnich podejść do powłoki jest prawdopodobnie drogą do zrobienia. Ponieważ jest to "zaplanowane" dodawanie do mongoexport i mongoimport z TOOLS-87 , ale oczywiście „jeszcze nie rozwiązano”. Więc jeśli chcesz uzyskać inny wynik, zrób to sam.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongusta:o co chodzi z _doc?

  2. używanie $i $match w mongodb

  3. Jak mogę częściowo zaktualizować obiekt w MongoDB, aby nowy obiekt nałożył się / scalił z istniejącym?

  4. Aplikacja węzła nie odpowiada po pewnym czasie

  5. Jak przekazać wartość MongoDb Json do siatki KendoUI za pomocą metody webservice?