我目前正在使用 MongoDB 数据库。我的问题是我有很多同名的人,但他们是不同的人,年龄、出生地等不同。
文档示例如下:
{
"_id" : ObjectId("6072fee3145c156c123ce3"),
"Users" : [
{
"name" : "John Davies",
"age" : NumberLong(35),
"place_of_birth" : "Cardigan"
},
{
"name" : "Edward Jones",
"age" : "blank",
"place_of_birth" : "Liverpool"
},
{
"name" : "Daniel Rhys",
"age" : NumberLong(63),
"place_of_birth" : "Cardigan"
},
{
"name" : " Evan Williams",
"age" : NumberLong(61),
"place_of_birth" : "Cardigan"
},
{
"name" : "John Davies ",
"age" : NumberLong(21),
"place_of_birth" : "Cardigan"
}
]
}
{
"_id" : ObjectId("6072fee3145c156c321ef6"),
" Users " : [
{
"name" : "John Davies",
"age" : NumberLong(35),
"place_of_birth" : "Swansea"
},
{
"name" : "Edward Jones",
"age" : "blank",
"place_of_birth" : "Liverpool"
},
{
"name" : "Daniel Rhys ",
"age" : NumberLong(63),
"place_of_birth" : "Barry"
},
{
"name" : "Evan Williams",
"age" : NumberLong(61),
"place_of_birth" : "Cardigan"
},
{
"name" : "John Davies",
"age" : NumberLong(21),
"place_of_birth" : "Cardigan"
}
]
}
所以我的目标是查询这些数据,以便一次性获得所有姓名以及每个唯一人的年龄和出生地。
所以输出应该包含(我只是放了一个表格来更清楚地显示查询结果应该是什么):
姓名 | 年龄 | 出生地 |
---|---|---|
约翰戴维斯 | 35 | 开衫 |
爱德华琼斯 | 空白 | 利物浦 |
丹尼尔瑞斯 | 63 | 开衫 |
埃文·威廉姆斯 | 61 | 开衫 |
约翰戴维斯 | 21 | 开衫 |
丹尼尔瑞斯 | 63 | 巴里 |
约翰戴维斯 | 35 | 斯旺西 |
对于最佳方法的任何建议或指导将不胜感激
答案 0 :(得分:1)
$unwind
解构 Users
数组$group
by Users
对象$replaceRoot
将 Users
对象替换为 rootdb.collection.aggregate([
{ $unwind: "$Users" },
{ $group: { _id: "$Users" } },
{ $replaceRoot: { newRoot: "$_id" } }
])
第二个选项:$replaceRoot
的替代,
$project
显示必填字段db.collection.aggregate([
{ $unwind: "$Users" },
{ $group: { _id: "$Users" } },
{
$project: {
_id: 0,
name: "$_id.name",
age: "$_id.age",
place_of_birth: "$_id.place_of_birth"
}
}
])