在 MongoDB 中重命名查询结果中的字段
有时,当您在MongoDB中查询集合时,您可能对字段名称不满意。默认情况下,字段名称只是实际文档中字段名称的反映。
也许字段名称不一致,或者有拼写错误。无论出于何种原因,都可以使用聚合管道阶段重命名查询结果中的字段。$project
在某些方面,这与在SQL中使用别名相当,因为它不会重命名基础字段,而只是在查询结果中重命名它们。
例
假设我们返回一个集合的内容,如下所示:
db.employees.find()
结果:
{ “_id” : 2, “name” : “Sarah”, “salary” : 128000 } { “_id” : 3, “name” : “Fritz”, “salary” : 25000 } { “_id” : 4, “name” : “Chris”, “salary” : 45000 } { “_id” : 5, “name” : “Beck”, “salary” : 82000 }
在这里,我们使用该方法返回集合的内容。[find()](https://database.guide/mongodb-find/ "MongoDB find()")
在这种情况下,每个字段的名称将在结果中返回。
但是,如果我们希望字段名称不同,该怎么办?例如,如果我们想替换为 ?name``employee
在这种情况下,我们可以使用该方法来执行如下查询:aggregate()
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": 1 }}
])
结果:
{ “_id” : 2, “salary” : 128000, “employee” : “Sarah” } { “_id” : 3, “salary” : 25000, “employee” : “Fritz” } { “_id” : 4, “salary” : 45000, “employee” : “Chris” } { “_id” : 5, “salary” : 82000, “employee” : “Beck” }
请注意,MongoDB按插入顺序显示字段,这会导致字段显示在字段之前。如果这是不可接受的,我们可以随时将查询更改为以下内容:salary``employee
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": "$salary" }}
])
结果:
{ “_id” : 2, “employee” : “Sarah”, “salary” : 128000 } { “_id” : 3, “employee” : “Fritz”, “salary” : 25000 } { “_id” : 4, “employee” : “Chris”, “salary” : 45000 } { “_id” : 5, “employee” : “Beck”, “salary” : 82000 }
重命名嵌入文档中的字段
您可以使用相同的方法重命名嵌入文档中的字段。在这种情况下,请使用点表示法来引用要重命名的字段。
假设我们对集合运行以下查询:pets
db.pets.find().pretty()
结果:
{ “_id” : 1, “name” : “Wag”, “details” : { “type” : “Dog”, “weight” : 20, “awards” : { “Florida Dog Awards” : “Top Dog”, “New York Marathon” : “Fastest Dog”, “Sumo 2020” : “Biggest Dog” } } } { “_id” : 2, “name” : “Fetch”, “details” : { “born” : ISODate(“2020-06-22T14:00:00Z”), “color” : “Black” } } { “_id” : 3, “name” : “Scratch”, “details” : { “eats” : [ “Mouse Porridge”, “Bird Soup”, “Caviar” ], “type” : “Cat”, “born” : ISODate(“2020-12-19T14:00:00Z”) } }
我们可以像这样重命名嵌入文档中的字段:
db.pets.aggregate([
{ "$project":
{
"_id": 0,
"Pet": "$name",
"Type": "$details.type",
"Born": "$details.born"
}
}
])
结果:
{ “Pet” : “Wag”, “Type” : “Dog” } { “Pet” : “Fetch”, “Born” : ISODate(“2020-06-22T14:00:00Z”) } { “Pet” : “Scratch”, “Type” : “Cat”, “Born” : ISODate(“2020-12-19T14:00:00Z”) }
在这种情况下,我没有选择嵌入文档中的所有字段,但您明白了。
我也曾经省略过这个字段。"_id": 0``_id
另请注意,如果文档实际上没有在阶段中指定的字段,则在生成的文档中将省略该字段。您可以在第一个文档(省略该字段)和第二个文档(省略该字段)中看到这一点。$project``Born``Type