2015-11-10 202 views
1

在以下查詢中,我試圖找到上週進行的articles集合中的條目,並按該文章的投票數排序。 $match似乎不工作(也許我不知道如何使用它)。下面的查詢作品完美,所以它不是一個日期格式問題,使用日期聚合的Mongo查詢

db.articles.find(timestamp:{ 
       '$lte':new Date(), 
       '$gte':new Date(ISODate().getTime()-7*1000*86400)} 
     }) 

但是這一次不取任何結果。如果沒有$match它也會提取所需的結果(按投票計數排序的文章)。

db.articles.aggregate([ 
    { 
     $project:{ 
      _id:1, 
      numVotes:{$subtract:[{$size:"$votes.up"},{$size:"$votes.down"}]}} 
    }, 
    { 
     $sort:{numVotes:-1} 
    }, 
    { 
     $match:{ 
      timestamp:{ 
       '$lte':new Date(), 
       '$gte':new Date(ISODate().getTime()-7*1000*86400)} 
     } 
    } 
]) 

回答

2

您試圖在管線末端進行匹配,這意味着您已經計劃了時間戳字段,而您沒有這樣做。

我相信你想要的是在聚合之前過濾數據,所以你應該把匹配放在聚合數組的頂部。

試試這個:

db.articles.aggregate([{ 
    $match: { 
     timestamp: { 
      '$lte': new Date(), 
      '$gte': new Date(ISODate().getTime() - 7 * 1000 * 86400) 
     } 
    } 
}, { 
    $project: { 
     _id: 1, 
     numVotes: { 
      $subtract: [{ 
       $size: "$votes.up" 
      }, { 
       $size: "$votes.down" 
      }] 
     } 
    } 
}, { 
    $sort: { 
     numVotes: -1 
    } 
}]) 
+1

真棒!我認爲命令並不重要。 –

+2

這就是他們稱之爲「管道」的原因。您需要將聚合視爲一系列將按順序進行的轉換。您甚至可以多次投影和匹配數據。例如:你可以匹配,項目,組,項目再次,匹配,並最終排序。 –