MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Преоформете масив, който се съхранява в колекция и експортирайте в CSV

Можете да се справите с това по няколко начина.

Първо, ако разполагате с MongoDB 3.4, тогава можете да използвате „Изглед“ за да се представи колекцията със съдържанието на масива "un-wind". „Изгледът“ е основно оператор за конвейер за агрегиране, който изглежда като нормална колекция, що се отнася до повечето действия, които биха използвали колекция.

Така че ако приемем, че вашата колекция източник се нарича "pages" тук, тогава ще създадете „Изглед“ с:

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

След това можете да направите запитване към колекцията както обикновено:

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

И впоследствие издайте mongoexport сякаш е нормална колекция:

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

Разбира се добавяне на --out или стандартно пренасочване за действително извеждане във файл.

Ако вашата MongoDB е по-стара версия, но има поне $out наличен (от MongoDB 2.6), след това запишете в друга колекция:

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

След това основно изпълнявате същия mongoexport както по-горе, тъй като това също е колекция, която е достъпна за това.

Ако наистина не искате да създавате нито „Изглед“, нито „друга колекция“, можете просто да изпратите кратък скрипт до mongo черупка. Макар и по много хакерски начин:

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

Или дори без aggregate() и $unwind изобщо:

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

Което ви дава същия резултат:

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

Имайте предвид също, че ако искате или се „нуждаете“ от разделител, различен от запетая , тук, тогава някой от последните два подхода с обвивката вероятно е правилният начин. Тъй като това е „планирано“ за добавяне към mongoexport и mongoimport с TOOLS-87 , но разбира се „все още не е разрешено“. Така че, ако искате различен резултат, направете го сами.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Не може да импортира mongodb

  2. MongoDB заместващ знак в ключа на заявка

  3. Визуално управление на MongoDB документи и колекции

  4. Mongodb:Използвайте броя на записите при агрегиране след група

  5. Можете ли да имате разрешения за ниво на събиране в MongoDB?