HOWTO · MongoDB

使用 MongoDB Shell 列印文件值

本教程演示瞭如何使用 MongoDB shell 列印文件值而不是整個文件。

本頁內容

列印文件的價值也是一項令人難以置信的技能,我們可以根據專案的需要從中受益。本教程使用 MongoDB shell 列印文件值而不是列印完整文件。

使用 MongoDB Shell 列印文件值

使用 Mongo shell 列印文件非常簡單,但是如何列印值和屬性而不是獲取整個文件呢?在深入研究細節之前,讓我們建立一個名為 teachers 的集合,其中包含如下給出的 JSON 文件。

建立集合:

> db.createCollection('teachers')

將 JSON 文件插入 teachers 集合中:

> db.teachers.insertMany(
  [
        {
            "first_name": "Mehvish",
            "last_name": "Ashiq",
            "gender": "Female",
            "grade": 18
        },
        {
            "first_name": "Tahir",
            "last_name": "Raza",
            "gender": "Male",
            "grade": 18
        },
        {
            "first_name": "Saira",
            "last_name": "Daniel",
            "gender": "Female",
            "grade": 20

        }
    ]

)

顯示 teachers 集合中的所有文件:

> db.teachers.find().pretty()

輸出:

{
        "_id" : ObjectId("6290440e7c524c650b7a51c0"),
        "first_name" : "Mehvish",
        "last_name" : "Ashiq",
        "gender" : "Female",
        "grade" : 18
}
{
        "_id" : ObjectId("6290440e7c524c650b7a51c1"),
        "first_name" : "Tahir",
        "last_name" : "Raza",
        "gender" : "Male",
        "grade" : 18
}
{
        "_id" : ObjectId("6290440e7c524c650b7a51c2"),
        "first_name" : "Saira",
        "last_name" : "Daniel",
        "gender" : "Female",
        "grade" : 20
}

一旦我們完成建立集合並用文件填充它,我們可以根據專案要求列印文件值。下面列出了一些場景:

  • 列印集合中所有文件的文件值
  • 僅列印第一個文件的文件值
  • 列印具有自定義屬性名稱的所有文件的文件值
  • 根據所有文件的指定條件列印文件值

列印集合中所有文件的文件值

示例程式碼:

> db.teachers.find().forEach(
    function (data) {
        Object.keys(data).forEach(
            function(key) {
                print(key + ': ' + data[key])
            }
        )
        print('\n')
    }
)

輸出:

_id: 6290440e7c524c650b7a51c0
first_name: Mehvish
last_name: Ashiq
gender: Female
grade: 18

_id: 6290440e7c524c650b7a51c1
first_name: Tahir
last_name: Raza
gender: Male
grade: 18

_id: 6290440e7c524c650b7a51c2
first_name: Saira
last_name: Daniel
gender: Female
grade: 20

此示例程式碼使用 find() 方法獲取所有 JSON 文件。然後,我們使用 JavaScript 的 forEach() 迴圈遍歷每個文件,並將每個文件作為 data 傳遞給匿名函式。

在此函式中,我們使用 Object.keys(data) 檢索 data 變數包含的特定文件的所有鍵(也稱為屬性或欄位名稱)。

此外,另一個 forEach() 方法用於迭代文件的鍵(儲存在 data 變數中)並呼叫另一個匿名函式以列印具有相應值的所有鍵。

僅列印第一個文件的文件值

示例程式碼:

> let result = db.getCollection('teachers').findOne()
> for (var key in result) {
    if (result.hasOwnProperty(key)) {
        print(key + ': ' + result[key]);
    }
}

輸出:

_id: 6290440e7c524c650b7a51c0
first_name: Mehvish
last_name: Ashiq
gender: Female
grade: 18

對於這個示例片段,我們使用 findOne() 方法僅從指定集合中檢索第一個文件並將其儲存到 result 物件中。

接下來,我們使用 JavaScript 的 for-in 迴圈遍歷 result 物件並返回一個 key 以訪問作為 result[key] 的值。

在訪問 key 的值之前,我們使用 hasOwnProperty() 方法檢查物件(在本例中為 result)是否具有給定屬性作為它自己的屬性。

列印具有自定義屬性名稱的所有文件的文件值

示例程式碼:

> db.teachers.find().forEach(
    function (document) {
        print("FirstName: " + document.first_name +"\n"+
              "LastName: " + document.last_name + "\n"+
              "Grade: " + document.grade)
        print("\n\n")
    }
)

輸出:

FirstName: Mehvish
LastName: Ashiq
Grade: 18

FirstName: Tahir
LastName: Raza
Grade: 18

FirstName: Saira
LastName: Daniel
Grade: 20

有時,我們不想獲取程式中指定的屬性名稱,但我們想使用自定義屬性名稱。如果是這樣,此解決方案適合你。

我們使用 find() 方法獲取 teachers 集合中的所有文件。然後,遍歷每個文件以使用鍵(也稱為欄位或屬性名稱)檢索值。

你可能已經注意到,在本示例中,我們沒有獲取名為 _id 的主鍵及其值。這是因為我們沒有在 print() 語句中指定它,但它仍然存在於 document 變數中。

使用以下程式碼進行檢查。

示例程式碼:

db.teachers.find().forEach(
    function (document) {
        print(document._id)
        print("\n\n")
    }
)

輸出:

ObjectId("6290440e7c524c650b7a51c0")

ObjectId("6290440e7c524c650b7a51c1")

ObjectId("6290440e7c524c650b7a51c2")

讓我們看下一節以避免在 Mongo shell 上出現這種情況。

根據指定條件列印所有文件的文件值

示例程式碼:

> db.teachers.find({}, {"grade": 1, "_id":0}).forEach(
    function(property) {
        print(property.grade)
})

輸出:

18
18
20

在這裡,我們需要先了解 find() 函式來了解示例程式碼。我們可以通過不同的方式使用 find() 方法來滿足需求;下面列出了一些格式:

  • 使用 find() 或 find({}) 從指定集合中獲取所有文件
  • 使用 find({}, {city: 1}) 檢索所有文件的 city 屬性及其值。
  • 使用 find({}, {city: 1, "_id:0"}) 獲取所有文件的 city 屬性及其值,但不顯示 ObjectId。在這裡,將 _id 的值設定為 0(預設為 1)不允許列印 ObjectId。

同樣,我們使用 find() 方法來檢索 grade 屬性及其值,而不顯示 _id 欄位。

但是,我們對每條記錄使用 forEach() 迴圈,僅列印傳遞給匿名函式的屬性值。我們可以使用 JavaScript 的箭頭函式優化程式碼。

示例程式碼:

db.teachers.find({}, {"grade": 1, "_id":0}).forEach( property => print(property.grade))

輸出:

18
18
20