簡體   English   中英

從Perl驅動程序插入MongoDB服務器日期

[英]Insert MongoDB Server Date from Perl driver

從MongoDB控制台,我可以:

>  db.log.insert({ dt : new Date })
>  db.log.find().sort({ $natural : -1 }).limit(1)
{ "_id" : ObjectId("50caae2cadd0e471af0b3941"), "dt" : ISODate("2012-12-14T04:42:20.560Z") } 

如何從Perl MongoDB驅動程序中執行相同的操作?

背景

我使用帶有上限集合的MongoDB進行日志記錄。 我知道ObjectID包含一個時間戳,但顯示它並查詢它並不簡單。 因此,我想為每個條目添加基於服務器的時間戳,但是無法弄清楚如何通過Perl驅動程序傳遞文字命令。

Perl MongoDB驅動程序使用DateTime對象來存儲日期,如果從數據庫中讀取日期,則將DateTime對象返回給您。

#!/usr/bin/env perl
use strict;
use warnings;
use MongoDB;
use MongoDB::OID;
use DateTime;

# database connection & collection
my $conn  = MongoDB::Connection->new;
my $db    = $conn->dates;
my $log   = $db->log;

# Delete Collection
$log->drop;

# Insert one
my $oid = $log->insert({ dt => DateTime->now });

# Show all
my $all = $log->find;
while ( my $entry = $all->next ) {
    printf "_id: %s dt: %s\n", $entry->{_id}->to_string, $entry->{dt}->format_cldr("dd.MM.yyyy HH:mm:ss");
}

如果你執行它,它會打印出像

_id: 50cb1b9321d30efd17000000 dt: 14.12.2012 12:29:07

您還應該閱讀DateTime文檔以了解您可以使用它做什么: http ://search.cpan.org/perldoc?DateTime

在Connection啟動時,您還可以設置所需的Date對象。

http://search.cpan.org/perldoc?MongoDB::Connection#dt_type

如果你將它設置為DateTime :: Tiny,例如它會更快。 但是你應該首先理解DateTime和DateTime :: Tiny之間的區別。 閱讀展位的文檔,並決定哪一個更好。


上面的示例創建了客戶端時間。 如果您想從服務器而不是客戶端獲得時間,因為客戶端/服務器不一樣。 你可以做兩件事。

首先,創建一個JavaScript函數,該函數返回Date對象並評估服務器上的函數。

# JavaScript function that return a Date object
my $now = MongoDB::Code->new(code => qq{function(){
    return new Date
}});

# later...
my $oid = $log->insert({ 
    dt => $dt,
    st => $db->eval($now),
});

第二種可能性。 MongoDB中的默認“_id”對象已經包含創建對象時的時間戳。 至少文檔說它來自服務器,我希望它真的來自服務器,不會由驅動程序創建。 但是如果$ entry是你的MongoDB結果,你可以通過這種方式從它獲取一個DateTime對象:

my $dt = DateTime->from_epoch(epoch => $entry->{_id}->get_time);

例:

#!/usr/bin/env perl
use strict;
use warnings;
use MongoDB;
use MongoDB::OID;
use MongoDB::Code;
use DateTime;

# database connection & collection
my $conn  = MongoDB::Connection->new;
my $db    = $conn->dates;
my $log = $db->log;

# Delete Collection
$log->drop;

# Client Time
my $dt = DateTime->now;

# JavaScript function that return a Date object
my $now = MongoDB::Code->new(code => qq{function(){
    return new Date
}});

# wait 2 seconds to see a difference between
# $dt and the $now function
sleep 2;

# Insert one
$log->insert({ 
    dt => $dt,
    st => $db->eval($now),
});

sleep 2;

$log->insert({ 
    dt => $dt,
    st => $db->eval($now),
});

# Show all
my $dtf = "dd.MM.yyyy HH:mm:ss";
my $all = $log->find;
while ( my $entry = $all->next ) {
    printf "dt: %s\n", $entry->{dt}->format_cldr($dtf);
    printf "st: %s\n", $entry->{st}->format_cldr($dtf);
    printf "_id time: %s\n", DateTime->from_epoch(epoch => $entry->{_id}->get_time)->format_cldr($dtf);
    print "\n";
}

輸出:

dt: 14.12.2012 16:29:28
st: 14.12.2012 16:29:30
_id time: 14.12.2012 16:29:30

dt: 14.12.2012 16:29:28
st: 14.12.2012 16:29:32
_id time: 14.12.2012 16:29:32

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM