【问题标题】:Querying, projecting and sorting multiple fields of documents inside a mongoDB collection在 mongoDB 集合中查询、投影和排序文档的多个字段
【发布时间】:2019-06-13 17:09:56
【问题描述】:

我有一个简单的 mongoDB 集合,名为 usersCollection,它的一般结构是这样的:

[
  {
    "username" : "john",
    "sex" : "m",
    "email" : "john@gmail.com",
    "courses" : [
        {
           "title" : "medicine",
           "grade": 25,
        },
        {
           "title" : "art",
           "grade": 29,
        },
        {
           "title" : "history",
           "grade": 21,
        }
    ]
  },
  {
    "username" : "jane",
    "sex" : "f",
    "email" : "jane@gmail.com",
    "courses" : [
        {
           "title" : "math",
           "grade": 20,
        },
        {
           "title" : "medicine",
           "grade": 30,
        }
    ]
  },
  {
    "username" : "sarah",
    "sex" : "f",
    "email" : "sarah@gmail.com",
    "courses" : [ ]
  },
  {
    "username" : "josh",
    "sex" : "f",
    "email" : "josh@gmail.com",
    "courses" : [
        {
           "title" : "english",
           "grade": 28,
        }
    ]
  },
  {
    "username" : "mark",
    "sex" : "m",
    "email" : "mark@gmail.com",
    "courses" : [
        {
           "title" : "history",
           "grade": 30,
        },
        {
           "title" : "medicine",
           "grade": 19,
        },
        {
           "title" : "math",
           "grade": 22,
        }
    ]
  }
]

每个用户都是 usersCollection 的成员,并拥有一些一般信息和他/她已经完成的课程列表以及相关成绩。

谁能告诉我如何查询 usersCollection 以获取一个降序排列的数组,其中包含已完成特定课程的所有用户的对象?该数组的每个对象都应包含相关用户的“姓名”、“电子邮件”和“等级”。

例如,对名为“medicine”的课程的 usersCollection 发起查询,我会得到这个数组:

[
  { 
    "username": "jane",
    "email": "jane@gmail.com", 
    "grade": 30
  },
  { 
    "username": "john",
    "email": "john@gmail.com", 
    "grade": 25
  },
  { 
    "username": "mark",
    "email": "mark@gmail.com", 
    "grade": 19
  }
]    

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您可以使用 mongoDB 的排序和分组管道来管理它。 如果您想获得任何特定的课程,您可以在排序管道之前应用匹配管道。

    db.users.aggregate([
        {
            $unwind: "$courses"
        },
        {
            $match: {
                    'courses.title': 'medicine'
            }
        },
        {
            $sort: {
                'courses.title': -1,
                'courses.grade': -1,
            }
        },
        {
            $group: {
                _id: "$courses.title",
                records: {
                    $push: {
                        "_id" : "$_id",
                        "username" : "$username",
                        "sex" : "$sex",
                        "email" : "$email",
                        "grade":"$courses.grade"
                    }
                }
            }
        }
    ])
    

    【讨论】:

    • 感谢您的回复!是的,我需要得到一个已完成并非所有可能课程的用户的降序排列数组,而只是一个特定的课程,例如不包括其他课程的“医学”课程,就像我上面的问题一样。你能告诉我我该怎么做吗?非常感谢您的帮助!
    • 添加匹配管道以获得特定结果。
    • 非常感谢您的帮助@Shivam Mishra!它工作正常!
    猜你喜欢
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2015-04-03
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多