MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Bentuk ulang array yang disimpan dalam koleksi dan ekspor ke CSV

Anda dapat mengatasinya dengan beberapa cara.

Pertama jika Anda memiliki MongoDB 3.4 yang tersedia maka Anda dapat menggunakan "View" untuk merepresentasikan koleksi dengan isi array "un-wound". "Tampilan" pada dasarnya adalah pernyataan alur agregasi yang tampaknya merupakan kumpulan normal sejauh menyangkut sebagian besar tindakan yang akan menggunakan kumpulan.

Jadi anggaplah koleksi sumber Anda disebut "pages" di sini, maka Anda akan membuat "Tampilan" dengan:

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

Kemudian Anda dapat menanyakan koleksi seperti biasa:

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

Dan selanjutnya keluarkan mongoexport seolah-olah itu adalah koleksi biasa:

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

Tentu saja menambahkan --out atau pengalihan standar untuk benar-benar menghasilkan file.

Jika MongoDB Anda adalah versi yang lebih lama tetapi setidaknya memiliki $out tersedia ( dari MongoDB 2.6 ) lalu tulis ke koleksi lain:

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

Maka pada dasarnya Anda menjalankan mongoexport yang sama seperti di atas karena ini juga merupakan koleksi yang dapat diakses untuk melakukannya.

Jika Anda benar-benar tidak ingin membuat "Tampilan" atau "koleksi lain", Anda cukup mengirim skrip pendek ke mongo kerang. Meskipun dengan cara yang sangat retas:

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

Atau bahkan tanpa aggregate() dan $unwind sama sekali:

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

Yang memberi Anda hasil yang sama:

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

Perhatikan juga bahwa jika Anda ingin atau "membutuhkan" pembatas yang berbeda dari koma , di sini, maka salah satu dari dua pendekatan terakhir dengan shell mungkin adalah cara yang harus dilakukan. Karena ini "dijadwalkan" untuk penambahan mongoexport dan mongoimport dengan TOOLS-87 , tetapi tentu saja "belum diselesaikan". Jadi jika ingin hasil yang berbeda, lakukan sendiri.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. tidak dapat terhubung ke mongodb yang dihosting di server jauh menggunakan monk

  2. Cara menggunakan operasi $cond dalam kerangka agregasi Spring-MongoDb

  3. cara menjalankan kueri hanya baca pada replika sharded yang diatur di mongodb

  4. Pembacaan DBname.system.indexes gagal pada cluster Atlas oleh mongobee setelah terhubung

  5. query mongo :temukan jumlah array di semua dokumen koleksi