2016-11-30 40 views
1

比方说,我有这个2的庞大文件:如何提高mongoDB中的聚合查询?

[ 
{ 
    _id: ...., 
    status: "A", 
    class: "DIP1A", 
    "created.user._id": ..., 
    "created.dt": ...., 
    "category": "private", 
    price: 100.00 //type double 
}, 
{ 
    _id: ...., 
    status: "A", 
    class: "DIP2A", 
    "created.user._id": ... 
    "created.dt": ..., 
    "category": "public", 
    price: 200.00 //type double 
}, 
]; 

查询:

var pipeline = [ 

       { 
       $match: { 
        "created.user._id": .... 
       } 
       }, 
       { 
       $unwind: "$class" 
       }, 
       { 
       $unwind: "$price" 
       }, 
       { 
       $group: { 
        _id: "$class", 
        price: { 
        $sum: "$price" 
        }, 
        count: { 
        $sum: 1 
        } 
       } 
       }, 
       { 
       $project: { 
        _id: 0, 
        class: '$_id', 
        count: 1, 
        price: 1 
       } 
       } 
    ]; 

db.myCollection.aggregate(pipeline); 

问题问题:

  • 查询无算/ $和 “$价格”,它的运行真的很快;

指标:

db.myCollection.ensureIndex({ 'created.user._id': -1 }); 
db.myCollection.ensureIndex({ 'created.user._id': -1, class: 1 }); 
db.myCollection.ensureIndex({ 'created.user._id': -1, price: 1}); 

性能:

  • 没有$总和计算的:5第二,庞大的记录。
  • with $ sum cals:20分钟有大量记录。
+1

您可以添加两个查询的解释?为了得到它,运行db.myCollection.aggregate(pipeline,{explain:true}) – felix

回答

0

你真正应该做的一件事就是把$ project阶段移到$ match阶段之后(如果文档包含更多的数据,然后在你的问题(大文档)中陈述)。 您希望通过管道获得尽可能少的数据。 另外我看到一个$放松的价格和类,但在你的例子中,他们不是阵列的。这可能是一个复制/粘贴问题;-)

像:

var pipeline = [ 

      { 
      $match: { 
       "created.user._id": .... 
      } 
      }, 
     { 
      $project: { 
       _id: 0, 
       class: '$_id', 
       count: 1, 
       price: 1 
      } 
      }, 
      { 
      $unwind: "$class" 
      }, 
      { 
      $unwind: "$price" 
      }, 
      { 
      $group: { 
       _id: "$class", 
       price: { 
       $sum: "$price" 
       }, 
       count: { 
       $sum: 1 
       } 
      } 
      }, 
];