簡體   English   中英

Mongodb foreach用於嵌套集合以將文檔更新/復制到另一個集合

[英]Mongodb foreach for nested collection to update/copy documents to another collection

我們有以下格式的收藏

{
    "_id" : ObjectId("5640bdec1b988de0be31724e"),     
    "xyz" : "Toshiba Satellite Pro 4600 PIII800",
    "Manufacture": "Toshiba"    
    "mappingData" : {       
        "title" : "xyz"  
    "brand" : "manufacture"     
    },
   "_id" : ObjectId("5640bdec1b9435dfgdf43554b"),     
    "abc" : "Apple Ihone",
    "mappingData" : {       
        "title" : "abc",
    "brand" : "Company"        
    }
}

我想編寫查詢並期望查詢結果來創建帶有以下文檔的另一個集合。

{
 "title": "Toshiba Satellite Pro 4600 PIII800",
 "Manufacture":"Toshiba"        
}

{
 "title": "Apple Ihone",
 "Manufacture":"Apple"      
}

我形成查詢以獲取預期結果,但返回錯誤。

db.products.find().limit( 5 ).forEach(function(myDoc) { 
    var q = {};   
    myDoc.mappingData.array.forEach(function(doc){
        q[doc]= myDoc[myDoc.mappingData.doc];
        })  
     print(q);
//q will be inserted to new collection. 



})

返回錯誤"TypeError: myDoc.mappingData.array has no properties (shell):3"

請幫助我解決此問題。

如果要更新整個集合,則不需要在當前代碼中limit光標。 您收到的錯誤是因為products集合中的mappingData字段沒有名為array的子文檔字段。 在問題的示例中,只有title子文檔字段可用,而這正是您想要的字段。

根據產品集合的大小,將轉換后的文檔插入到新集合中可能會影響您的操作。 您可以使用新的無序批量插入API來避免緩慢的插入性能,該API通過批量發送來簡化插入操作,甚至更好,它為您提供關於成功與失敗的真實反饋。

以下批量插入API操作將使用括號符號創建新屬性,將所需的數據結構插入到newcollection ,在products游標的forEach()循環中創建新文檔的位置。 在批量插入中,您將以1000個批次的方式將操作發送到服務器,這將帶來更好的性能,因為您不會將每個請求發送到服務器,而只是每1000個請求發送一次:

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM