2012-03-19 39 views
5

Tương đối mới đối với mongo, tôi đọc trong hướng dẫn mongo về Tối ưu hóa ID đối tượng.Mongo phạm vi ngày truy vấn bằng cách sử dụng _id trong PHP

http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-Extractinsertiontimesfromidratherthanhavingaseparatetimestampfield.

Đi với sự giới thiệu về KHÔNG tạo ra một sân Created_On riêng biệt, tôi quyết định sau này sẽ trích xuất ra các ngày từ _id lĩnh vực mà là một ObjectID

Bây giờ, tôi có nhiều kỷ lục tất cả với ra một lĩnh vực Created_On.

Tôi đang cố gắng để truy vấn cho một phạm vi ngày, nhưng không chắc chắn về cú pháp:

$start = new MongoDate(strtotime("2012-03-01 00:00:00")); 
$end = new MongoDate(strtotime("2012-03-15 00:00:00")); 

$collection->find(array('_id' => array('$gt' => $start, '$lte' => $end))); 

Luôn luôn trả về 0 kết quả. Mặc dù tôi có thể truy vấn hồ sơ cá nhân và trích xuất ngày từ đối tượng.

Trả lời

12

Trong PHP, bạn cần phải làm điều gì đó như:

function timeToId($ts) { 
    // turn it into hex 
    $hexTs = dechex($ts); 
    // pad it out to 8 chars 
    $hexTs = str_pad($hexTs, 8, "0", STR_PAD_LEFT); 
    // make an _id from it 
    return new MongoId($hexTs."0000000000000000"); 
} 

$start = strtotime("2012-03-01 00:00:00"); 
$end = strtotime("2012-03-15 00:00:00"); 

$collection->find(array('_id' => array('$gt' => timeToId($start), '$lte' => timeToId($end)))); 

Sau đó, bạn có thể sử dụng để truy vấn lĩnh vực _id.

tôi đã viết một bài đăng blog mô tả quá trình ở đây: http://www.snailinaturtleneck.com/blog/2011/12/20/querying-for-timestamps-using-objectids/

+1

Thú vị, nhưng làm thế nào tôi có thể sử dụng này cho một truy vấn phạm vi ngày dựa trên ngày tạo bên trong '_id'? –

+1

Tôi đã cập nhật phản hồi của mình để hiển thị giao diện truy vấn ban đầu của bạn. – kristina

+0

Cảm ơn bạn rất nhiều vì phản hồi của bạn. Về hiệu suất, nó vẫn còn tốt hơn để lưu trữ thời gian tạo thành một lĩnh vực riêng biệt? –

Các vấn đề liên quan