[英]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.