聚合管道中一旦调用$project或$unwind,就不能再使用索引来匹配或排序集合,这对于大数据量的集合查询性能是非常低下的

结论确认中
解决方案寻找中

源数据

db.fill.find({});
{ "creatorAccount" : "zhangsan", "creatorName" : "张三", "list" : [ { "fieldId" : "1", "score" : 60, "text" : "语文" }, { "fieldId" : "2", "score" : 80, "text" : "数学" }, { "fieldId" : "3", "score" : 90, "text" : "英语" } ] }
{ "creatorAccount" : "lisi", "creatorName" : "李四", "list" : [ { "fieldId" : "1", "score" : 75, "text" : "语文" }, { "fieldId" : "2", "score" : 70, "text" : "数学" }, { "fieldId" : "3", "score" : 95, "text" : "英语" } ] }
{ "creatorAccount" : "wangwu", "creatorName" : "王五", "list" : [ { "fieldId" : "1", "score" : 85, "text" : "语文" }, { "fieldId" : "2", "score" : 78, "text" : "数学" }, { "fieldId" : "3", "score" : 80, "text" : "英语" } ] }

$unwind 实战

1)查询李四哪个科目分数最高

db.fill.aggregate([{$match : { "creatorAccount" : "lisi" }},{$unwind: '$list'},{$project: {"_id": 0,"creatorAccount" : 1, "creatorName" : 1, "fillValues" : 1}}, {$sort : {"list.score":-1}}])
{ "creatorAccount" : "lisi", "creatorName" : "李四", "list" : { "fieldId" : "3", "score" : 95, "text" : "英语" } }
{ "creatorAccount" : "lisi", "creatorName" : "李四", "list" : { "fieldId" : "1", "score" : 75, "text" : "语文" } }
{ "creatorAccount" : "lisi", "creatorName" : "李四", "list" : { "fieldId" : "2", "score" : 70, "text" : "数学" } }

2)查询数学分数最高的同学名字

db.fill.aggregate([{$unwind: '$list'},{$match : { "list.text" : "数学" }},{$project: {"_id": 0,"creatorAccount" : 1, "creatorName" : 1, "fillValues" : 1}}, {$sort : {"list.score":-1}}])
{ "creatorAccount" : "zhangsan", "creatorName" : "张三", "list" : { "fieldId" : "2", "score" : 80, "text" : "数学" } }
{ "creatorAccount" : "wangwu", "creatorName" : "王五", "list" : { "fieldId" : "2", "score" : 78, "text" : "数学" } }
{ "creatorAccount" : "lisi", "creatorName" : "李四", "list" : { "fieldId" : "2", "score" : 70, "text" : "数学" } }

3)查询数学分数最高的同学,并且列出其它科目的成绩

db.fill.aggregate([{$project: {"_id": 0,"creatorAccount" : 1, "creatorName" : 1, "list" : 1, "listTmp":"$list"}}, {$unwind: '$listTmp'},{$match : { "listTmp.text" : "数学" }}, {$sort : {"listTmp.score":-1}}]);
{ "creatorAccount" : "zhangsan", "creatorName" : "张三", "list" : [ { "fieldId" : "1", "score" : 60, "text" : "语文" }, { "fieldId" : "2", "score" : 80, "text" : "数学" }, { "fieldId" : "3", "score" : 90, "text" : "英语" } ], "listTmp" : { "fieldId" : "2", "score" : 80, "text" : "数学" } }
{ "creatorAccount" : "wangwu", "creatorName" : "王五", "list" : [ { "fieldId" : "1", "score" : 85, "text" : "语文" }, { "fieldId" : "2", "score" : 78, "text" : "数学" }, { "fieldId" : "3", "score" : 80, "text" : "英语" } ], "listTmp" : { "fieldId" : "2", "score" : 78, "text" : "数学" } }
{ "creatorAccount" : "lisi", "creatorName" : "李四", "list" : [ { "fieldId" : "1", "score" : 75, "text" : "语文" }, { "fieldId" : "2", "score" : 70, "text" : "数学" }, { "fieldId" : "3", "score" : 95, "text" : "英语" } ], "listTmp" : { "fieldId" : "2", "score" : 70, "text" : "数学" } }
03-23 04:45