获取所有唯一用户的 MongoDB 查询

时间:2021-04-24 15:06:27

标签: mongodb aggregation-framework

我目前正在使用 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 斯旺西

对于最佳方法的任何建议或指导将不胜感激

1 个答案:

答案 0 :(得分:1)

  • $unwind 解构 Users 数组
  • $group by Users 对象
  • $replaceRootUsers 对象替换为 root
db.collection.aggregate([
  { $unwind: "$Users" },
  { $group: { _id: "$Users" } },
  { $replaceRoot: { newRoot: "$_id" } }
])

Playground


第二个选项:$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"
    }
  }
])

Playground