HOWTO · MongoDB
使用 forEach() 更新 MongoDB Shell 中的陣列欄位
本教程演示瞭如何使用 forEach() 更新 MongoDB shell 中的陣列欄位。
本頁內容
今天,我們將學習如何在使用 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。