2012-11-27 58 views
18

從的ObjectId執行日期範圍查詢我有一個集合,看起來像這樣:的MongoDB:在蒙戈外殼

{ 
    _id: ObjectId("50a68673476427844b000001"), 
    other fields 
} 

我想做一個範圍查詢兩個日期之間找到記錄。我知道,我可以從在的ObjectId蒙戈外殼VAR日期這樣做:

var aDate = ObjectId().getTimestamp() 

但沒有辦法(據我可以在瞬間計算出)創建的ObjectId由剛時間戳部分 - 我認爲我的理想的解決方案是不起作用的蒙戈外殼代碼如下:

var minDate = ObjectId(new Date("2012-11-10")); 
var maxDate = ObjectId(new Date("2012-11-17")); 

使用帶的minDate和MAXDATE的範圍值查找。

有沒有辦法在殼裏做這個 - 我不感興趣,一些司機的產品。

+0

前8個字節mongoid所提供的解決方案是十六進制的時間戳,所以你可以創建一個從迄今取得前8個字節的有效的ObjectId,休息只是零和然後做類似於這樣的查詢:'{_id:{$ gt:ObjectId(「5087e5b106cffca815000000」)} }' – 2012-11-27 22:34:14

+0

有一個很好的答案[我可以通過日期查詢MongoDB ObjectId嗎?](http:// stackoverflow。 COM /問題/ 8749971 /罐-I-查詢的mongodb-的objectid按日期),其包括一個'objectIdWithTimestamp()'JavaScript函數。您可以保存此功能在您的[.mongorc.js(http://www.mongodb.org/display/DOCS/Overview+-+The+MongoDB+Interactive+Shell#Overview-TheMongoDBInteractiveShell-.mongorc.js)有它在啓動時你'mongo'外殼可用。 – Stennie

回答

27

你可以在2個步驟:

var objIdMin = ObjectId(Math.floor((new Date('1990/10/10'))/1000).toString(16) + "000 
0000000000000") 
var objIdMax = ObjectId(Math.floor((new Date('2011/10/22'))/1000).toString(16) + "000 
    0000000000000") 
db.myCollection.find({_id:{$gt: objIdMin, $lt: objIdMax}}) 

或在一個步驟(是什麼的可讀性):

db.myCollection.find({_id:{$gt: ObjectId(Math.floor((new Date('1990/10/10'))/1000).toString(16) + "000 
    0000000000000"), $lt: ObjectId(Math.floor((new Date('2011/10/10'))/1000).toString(16) + "000 
    0000000000000")}}) 
+0

甚至更​​好:'函數dateFromObj(strDate){ 返回的ObjectId(Math.floor((新日期(strDate))/ 1000)的ToString(16)+ 「0000000000000000」) }' –

3

使用蒙戈外殼:

可以使用的ObjectId 。FromDate內置方法:

db.mycollection.find({_id:{$gt:ObjectId.fromDate(new Date('2017-09-23'))}}); 

從Node.js的驅動程序,您可以使用@jksdua here