文件样本:
{
"_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 }
]);
我需要从上面的查询中得到以下内容:
u._id
返回记录中的记录和电子邮件总数,如下所示:
{ “结果”: [ { “email”:“”, “总计”:“” }, { “email”:“”, “总计”:“” } ] “好”: 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管道“|”命令,或以其他方式查找。然后你的想法将落实到位。