sql >> データベース >  >> NoSQL >> MongoDB

コレクションに保存されている配列の形状を変更し、CSVにエクスポートします

    これにはさまざまな方法で対処できます。

    まず、MongoDB 3.4を利用できる場合は、"View" を使用できます。 配列の内容が「巻き戻された」状態でコレクションを表すため。 「ビュー」は基本的に、コレクションを使用するほとんどのアクションに関する限り、通常のコレクションのように見える集約パイプラインステートメントです。

    したがって、ソースコレクションを"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
    

    また、コンマとは異なる区切り文字が必要または「必要」な場合は、,にも注意してください。 ここでは、シェルを使用した最後の2つのアプローチのいずれかがおそらく進むべき道です。これはmongoexportに追加するために「スケジュール」されているため およびmongoimport TOOLS-87 を使用 、しかしもちろん「まだ解決されていない」です。したがって、別の出力が必要な場合は、自分で行います。




    1. Pymongoでの全文検索

    2. maxDistanceのmongodbマングース単位

    3. MongoDB:メッセージングアプリに最適なデザイン

    4. MongoDB C#ドライバークエリビルダーでアイテム数を取得する