使用 forEach() 更新 MongoDB Shell 中的陣列欄位
Mehvish Ashiq
2022年6月21日
今天,我們將學習如何在使用 MongoDB shell 時使用 forEach()
來更新陣列欄位。
使用 forEach()
更新 MongoDB Shell 中的陣列欄位
要使用 forEach()
,讓我們準備一個名為 collection
的樣本集合,其中包含兩個文件。你也可以使用下面的查詢來繼續我們的工作。
示例程式碼:
> use updateArrayField
> db.createCollection('collection');
> db.collection.insertMany([
{
"name": "Mehvish",
"gender": "Female",
"fields" : [
{ "_id" : 1, "items" : [ 1,3,4,5,6,7 ] }
]
},
{
"name": "Thomas Christopher",
"gender": "Male",
"fields" : [
{ "_id" : 1, "items" : [ 1,3,4,5,6,7 ] }
]
}
]);
接下來,我們使用這些文件來更新名為 fields.items
的陣列欄位
"items" : [ 1,3,4,5,6,7]
至
"items" : [
{item: 1, key: 0},
{item: 3, key: 0},
{item: 4, key: 0},
{item: 5, key: 0},
{item: 6, key: 0},
{item: 7, key: 0}
]
為此,我們可以使用巢狀的 forEach()
,如下所示。
示例程式碼:
> var table = db.collection.find();
> table.forEach(function( oneRow ) {
var newFields = [];
oneRow.fields.forEach( function( oneField ){
var newItems = [];
oneField.items.forEach( function( item ){
var aNewItem = { item: parseInt(item), key: 0 };
newItems.push( aNewItem );
} );
newFields.push({ _id: oneField._id, items: newItems });
} )
db.collection.update(
{ _id: oneRow._id },
{ "$set": { "fields": newFields } }
);
});
在 mongo shell 上執行以下查詢以檢視更新的文件。
示例程式碼:
> db.collection.find()
輸出:
{
"_id" : ObjectId("62a708054eb9c63e48daeba4"),
"name" : "Mehvish",
"gender" : "Female",
"fields" : [
{
"_id" : 1,
"items" : [
{ "item" : 1, "key" : 0 },
{ "item" : 3, "key" : 0 },
{ "item" : 4, "key" : 0 },
{ "item" : 5, "key" : 0 },
{ "item" : 6, "key" : 0 },
{ "item" : 7, "key" : 0 }
]
}
]
}
{
"_id" : ObjectId("62a708054eb9c63e48daeba5"),
"name" : "Thomas Christopher",
"gender" : "Male",
"fields" : [
{
"_id" : 1,
"items" : [
{ "item" : 1, "key" : 0 },
{ "item" : 3, "key" : 0 },
{ "item" : 4, "key" : 0 },
{ "item" : 5, "key" : 0 },
{ "item" : 6, "key" : 0 },
{ "item" : 7, "key" : 0 }
]
}
]
}
為了獲得上述輸出,我們從 collection
中讀取所有資料並使用 forEach()
迭代 collection
的每個文件。接下來,我們使用另一個 forEach()
來遍歷指定文件的每個欄位。
然後,第三個 forEach()
用於迭代 collection
中 fields.items
欄位的值。我們使用每個值來形成所需的更新並將其儲存到 aNewItem
變數中,該變數使用 push()
方法進一步插入 newItems
陣列中。
之後,我們使用 oneField._id
和 newItems
陣列建立一個文件,將其推入 newFields
陣列,該陣列進一步用於更新 collection
。
Author: Mehvish Ashiq