使用 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
