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