使用 MongoDB Shell 打印文档值

Mehvish Ashiq 2023年1月30日 2022年6月2日
  1. 使用 MongoDB Shell 打印文档值
  2. 打印集合中所有文档的文档值
  3. 仅打印第一个文档的文档值
  4. 打印具有自定义属性名称的所有文档的文档值
  5. 根据指定条件打印所有文档的文档值
使用 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
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

相关文章 - MongoDB Print