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