【问题标题】:Aggregate Query in Mongodb returns specific fieldMongodb中的聚合查询返回特定字段
【发布时间】:2014-08-21 05:55:46
【问题描述】:

文档样本:

{
    "_id" : ObjectId("53329dfgg43771e49538b4567"),
    "u" : {
        "_id" : ObjectId("532a435gs4c771edb168c1bd7"),
        "n" : "Salman khan",
        "e" : "salman@gmail.com"
    },
    "ps" : 0,
    "os" : 1,
    "rs" : 0,
    "cd" : 1395685800,
    "ud" : 0
}

查询:

db.collectiontmp.aggregate([
            {$match: {os:1}},
            {$project : { name:{$toUpper:"$u.e"} , _id:0 } },
            {$group: { _id: "$u._id",total: {$sum:1} }},
            {$sort: {total: -1}}, { $limit: 10 }
             ]);

我需要上述查询中的以下内容:

  1. u._id分组
  2. 从记录中返回记录总数和邮件,如下图:

    { “结果”: [ { “电子邮件”: ””, “全部的”: ”” }, { “电子邮件”: ””, “全部的”: ”” } ], “行”: 1 }

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您在这里做错的第一件事是不了解$project 的工作原理。 $project$group 等管道阶段将仅输出“显式”标识的字段。因此,只有您说要输出的字段可用于以下管道阶段。

    特别是在这里,您仅“投影”了文档中“u”字段的一部分,因此您删除了其他可用数据。现在这里唯一存在的字段是“名称”,这是您“投影”的字段。

    也许你真的打算这样做:

    db.collectiontmp.aggregate([
        { "$group": {
            "_id": {
               "_id": "$u._id",
               "email": { "$toUpper": "$u.e" }
            },
            "total": { "$sum": 1 },
        }},
        { "$project": {
            "_id": 0,
            "email": "$_id.email",
            "total": 1
        }},
        { "$sort": { "total": -1 } },
        { "$limit": 10 }
    ])
    

    甚至:

    db.collectiontmp.aggregate([
        { "$group": {
            "_id": "$u._id",
            "email": { "$first": { "$toUpper": "$u.e" } }
            "total": { "$sum": 1 },
        }},
        { "$project": {
            "_id": 0,
            "email": 1,
            "total": 1
        }},
        { "$sort": { "total": -1 } },
        { "$limit": 10 }
    ])
    

    这为您提供了您正在寻找的那种输出。

    请记住,由于这是一个“管道”,因此只有前一个阶段的“输出”可用于“下一个”阶段。文档没有“全局”概念,因为这不是 SQL 等声明性语句,而是“管道”。

    所以想想 Unix 管道“|”命令,或以其他方式查找。那么你的想法就会落到实处。

    【讨论】:

    • @Anubhav 在解释未指定的情况下如何省略字段的过程中,我无意中省略了这些字段。 $match 通常应该始终是您的第一阶段,因为这是可以使用索引的地方。如果需要,还可以在后期添加以进行额外过滤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2021-02-16
    • 2014-08-25
    • 2020-10-01
    • 2014-11-03
    相关资源
    最近更新 更多