2017-07-31 165 views
1

我有我的mongoDB中包含日期時間和其他值的對象的集合。 我該如何去查詢按日期時間查詢對象,時間戳設置爲9點?在MongoDB中按日期查詢日期時間

所以,如果我有以下集合...

id : 1, date : ISODate("2017-07-16T09:00:00.000+0000") 
id : 2, date : ISODate("2017-01-17T07:00:00.000+0000") 
id : 3, date : ISODate("2017-07-27T09:00:00.000+0000") 
id : 4, date : ISODate("2017-03-20T09:00:00.000+0000") 
id : 5, date : ISODate("2017-03-07T10:00:00.000+0000") 
id : 6, date : ISODate("2017-07-04T11:00:00.000+0000") 

返回值應該是...

id : 1, date : ISODate("2017-07-16T09:00:00.000+0000") 
id : 3, date : ISODate("2017-07-27T09:00:00.000+0000") 
id : 4, date : ISODate("2017-03-20T09:00:00.000+0000") 

我是相當新的MongoDB的,而不是非常有經驗將JS等等請儘量保持儘可能簡單。爲了說明,Neil Lunn將這個問題標記爲 This Question的重複,我認爲這是部分正確的,但它也比我需要的更復雜。

我不需要分組或任何這種性質,我只是想要一個查詢,告訴我哪些文檔存在包含此時間戳。

回答

1

您可以使用聚合管道將轉換爲匹配的轉換值。例如:

db.collection.aggregate([ 
    { 
     $project: { 
      timePart: {$dateToString: { format: "%H:%M:%S:%L", date: "$date"}},  
      date: 1 

     } 
    }, 
    { 
     $match: { 
      timePart: '09:00:00:000' 
     } 
    }, 
    { 
     $project: { 
      date: 1 
     } 
    } 
]) 

您可以將此視爲流水線;來自第一個步驟$project的輸出成爲$match步驟的輸入。 $project步驟輸出 - 對於基礎集合中的每個文檔 - 包含_iddate和一個名爲timePart的新屬性的文檔,該屬性已使用date屬性中的時間部分填充。然後$match步驟將這些文檔與您的過濾條件相匹配(在您的示例中,這是09:00:00:000即上午9點),然後將匹配的文檔轉發到下一步,再次使用$project運算符放棄timePart屬性,因爲我假設,這隻與saerching相關,不應包含在最終結果中。

其分解,第一步的輸出是這樣的:

{ 
    "_id" : 1, 
    date : ISODate("2017-07-16T09:00:00.000+0000"), 
    timePart: "09:00:00.000" 
}, 
{ 
    "_id" : 2, 
    date : ISODate("2017-01-17T07:00:00.000+0000"), 
    timePart: "07:00:00.000" 
}, 
... 

第二步排除與id: 2文件,因爲它timePart不匹配09:00:00.000然後將文檔與id: 1轉發到第三該階段然後選擇 - 從第2步轉發這些文件 - 領域_iddate從而給你:

{ 
    "_id" : 1, 
    date : ISODate("2017-07-16T09:00:00.000+0000") 
}, 
{ 
    "_id" : 3, 
    date : ISODate("2017-07-27T09:00:00.000+0000") 
}, 
{ 
    "_id" : 4, 
    date : ISODate("2017-03-20T09:00:00.000+0000") 
} 

注:此approac h在應用匹配階段之前必須將的日期屬性改爲文檔,如果對於您來說這太令人擔憂了,那麼您可能需要重新考慮如何持續保存這些數據。

+0

我對MongoDB相當陌生,所以讓我來總結一下,看看我是否正確地得到這個結果:對於每個文檔,你取日期,格式化它,把它變成一個字符串,然後到一個時間部分,然後你將它匹配到另一個由字符串組成的時間部分? – SpiritBH

+0

我已經更新了答案,以解釋聚合管道的性質。希望有所幫助。 – glytching

+0

謝謝你,這個工作就像一個魅力,你幫助我更好地理解這一點。 – SpiritBH