2015-10-13 55 views
0

我試圖將n的唯一日期(允許說2000+記錄)傳遞給前端,給用戶一個mm/yyyy的列表以便按月選擇記錄。查詢一個月/年的記錄集(不是ISO DATE)

然後我需要它將他們選定的月份作爲ID(當前格式爲mm-yyyy)傳遞到後端,然後在該月份/年中僅查詢該組記錄。

我能夠獲得所有記錄的所有不同月份/年份。但現在我需要通過month/year作爲參數。

我的問題是:如何查詢所有符合給定月份/年份的記錄?

我之前發佈了關於similar的更多信息,其中user3100115建議使用$redact

Docs說在一年內通過,{ $match: { year: 2014 } },,我假設你也可以在一個月內做到這一點。但之後並沒有真正理解它的「編輯」部分。

所以我只是想用$比賽和今年獲得的所有記錄:

db.mycollection.aggregate({ $match: { year: 2015 } });,因爲我沒有一個簡單的year場在我的文檔......而一個與date ISO格式返回其無。


我已經試過

var query = Order.aggregate(
     { 
      $project: 
      { 
       year : 
       { 
        $year: '$date' 
       }, 
       month: 
       { 
        $month: '$date' 
       } 
      } 
     }, 
     { 
      $match: 
      { 
       year : year, 
       month: month 
      } 
     } 
    ); 

但這並不返回文檔對象,只有_id,月份,年份:

{ _id: 'someid', 
    year: 2015, 
    month: 3 }, 
    { _id: 'someid', 
    year: 2015, 
    month: 3 }, 

回答

1

首先,你需要拿出使用$project從ISODate字段中獲得年份和月份。然後你可以對投影值做一個$match。像下面的東西可能會給你一個想法。

$ created_at是MongoDB中的一個ISODate字段。

db.test.aggregate(
{ "$project": { 
     "year":{"$year":"$created_at"}, 
     "month":{"$month":"$created_at"},  
}, 
{ "$match":{ 
     "year" :2015, 
     "month": 3  
    } 
}) 

如果你需要更多的字段返回的結果,你可以增加這些領域的項目或其他與mongodb的$where條款試試。

db.test.find({$where : function() { return (this.date.getMonth() == 11 && this.date.getYear() == 2014)} }) 

注意:使用$ where可能會很慢。

+0

真棒,但我怎樣才能得到實際的文件從該物體。它只返回_id,month,year的對象。 – Growler

+0

只是增加了一些信息。看看是否有幫助。 –

+0

原來是爲了獲得完整的文檔對象,你可以做'document:「$$ ROOT」' – Growler

2

正如我所提到的,最好的方法是使用$redact運算符。

db.mycollection.aggregate([ 
    { "$redact": { 
     "$cond": [ 
      { "$and": [ 
       { "$eq": [ { "$year": "$date" }, 2015 ] }, 
       { "$eq": [ { "$month": "$date" }, 3 ] } 
      ] }, 
      "$$KEEP", 
      "$$PRUNE" 
     ] } 
    } 
]) 
+0

爲什麼這比上面的選項更好? – Growler

+0

因爲你只有在舞臺上才能更快。'$ redact'操作符在後臺執行'$ project'和'$ match'。也不要使用'$ where' – styvane

相關問題