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

ネストされたコレクションのMongodbforeachは、ドキュメントを別のコレクションに更新/コピーします

    コレクション全体を更新する場合は、limit 現在のコードでカーソルを合わせる必要はありません。発生するエラーは、mappingDataが原因です productsのフィールド コレクションには、arrayというサブドキュメントフィールドがありません 。質問の例から、titleのみ サブドキュメントフィールドが利用可能であり、それが必要なフィールドです。

    製品コレクションのサイズによっては、変換されたドキュメントを新しいコレクションに挿入すると、操作に影響する場合があります。新しい順序付けされていない一括挿入API 挿入操作をまとめて送信することで合理化され、さらに良いことに、何が成功し、何が失敗したかについての実際のフィードバックが得られます。

    次の一括挿入API操作は、newcollectionに挿入されます 製品コレクションカーソルの forEach() ループ、 ブラケット表記 を使用 新しいプロパティを作成します。一括挿入では、1000のバッチでサーバーに操作を送信します。これにより、すべてのリクエストをサーバーに送信するのではなく、1000リクエストごとに1回だけ送信するため、パフォーマンスが向上します。

    var bulk = db.newcollection.initializeUnorderedBulkOp(),   
        counter = 0;
    
    db.products.find().forEach(function(doc) { 
        var document = {};
        if (doc.mappingData.title) document["title"] = doc[doc.mappingData.title];
        document["Manufacturer"] = doc.Manufacture;
        bulk.insert(document);
        counter++;
        if (counter % 1000 == 0) {
            bulk.execute();
            bulk = db.newcollection.initializeUnorderedBulkOp();
        }
    });
    
    if (counter % 1000 != 0) { bulk.execute(); }
    

    上記の例では、バルクAPI操作から得られるフィードバックは次の形式になります。

    BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 2,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
    })
    

    新しいコレクションのクエリdb.newcollection.find() 生成されます:

    /* 0 */
    {
        "_id" : ObjectId("56558b0427adb60c9f7e6f8d"),
        "title" : "Toshiba Satellite Pro 4600 PIII800",
        "Manufacturer" : "Toshiba"
    }
    
    /* 1 */
    {
        "_id" : ObjectId("56558b0427adb60c9f7e6f8e"),
        "title" : "Apple Ihone",
        "Manufacturer" : undefined
    }
    



    1. マングースのクエリ結果は読み取り専用ですか?

    2. 制限を使用するときにMongoDBでドキュメントの総数を取得する

    3. -dフラグを使用すると、mongorestoreはどのような種類のファイルまたはディレクトリを予期しますか?

    4. サーバーデータベースとしてexpress、mongodbを使用したノードjsでのユーザー管理