コレクション全体を更新する場合は、limit
現在のコードでカーソルを合わせる必要はありません。発生するエラーは、mappingData
が原因です products
のフィールド コレクションには、array
というサブドキュメントフィールドがありません 。質問の例から、title
のみ サブドキュメントフィールドが利用可能であり、それが必要なフィールドです。
製品コレクションのサイズによっては、変換されたドキュメントを新しいコレクションに挿入すると、操作に影響する場合があります。新しい順序付けされていない
次の一括挿入API操作は、newcollection
に挿入されます 製品コレクションカーソルのforEach()
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
}