Mongodb中的聚合查询返回特定字段

时间:2014-08-21 05:55:47

标签: mongodb mongodb-query aggregation-framework

文件样本:

{
    "_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. 返回记录中的记录和电子邮件总数,如下所示:

    {     “结果”:     [         {             “email”:“”,             “总计”:“”         },         {             “email”:“”,             “总计”:“”         }     ]         “好”:     1 }

1 个答案:

答案 0 :(得分:12)

你在这里做的第一件事就是不了解$project的工作方式。管道阶段(例如$project$group)仅输出“明确”标识的字段。因此,只有您要输出的字段才可用于以下管道阶段。

具体来说,您只在文档中“投射”“u”字段的一部分,因此您删除了其他数据。现在唯一的现在字段是“name”,这是你“预测”的那个。

也许你真的打算做这样的事情:

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管道“|”命令,或以其他方式查找。然后你的想法将落实到位。