CouchDB: Timestamp inaccurate and seems to be cached

344 views
Skip to first unread message

Hank Knight

unread,
Jan 8, 2014, 9:17:29 AM1/8/14
to us...@couchdb.apache.org
I use this Map Function to get the current Unix timestamp:

function(doc) {emit(Math.round(new Date().getTime()/1000), null );}

The odd thing is, it returns a correct timestamp the first time I run
a query but it returns the exact same timestamp one minute later even
though 60 seconds have passed! Is this due to caching or something
else? What is the best way for me to always get the current Unix
timestamp?

Aurélien Bénel

unread,
Jan 8, 2014, 9:34:33 AM1/8/14
to us...@couchdb.apache.org
> I use this Map Function to get the current Unix timestamp:
> function(doc) {emit(Math.round(new Date().getTime()/1000), null );}

Eek! never do that.
A map function should be a function in a mathematical sense.
This means that the return value of map(x) should be ever and ever the same for a given x.


Regards,

Aurélien


Simon Metson

unread,
Jan 8, 2014, 9:33:57 AM1/8/14
to us...@couchdb.apache.org
You map function is only run when the data changes and the view needs to be rebuilt, so you’re not recording the time when you access view but the time when the document was processed by the view.

Can you explain what you’re trying to achieve? Is there a reason you can’t get the current time in the client application?

Mike Marino

unread,
Jan 8, 2014, 9:36:07 AM1/8/14
to us...@couchdb.apache.org
It's not exactly clear what you would like to do. Do you just want to get
the timestamp as seen by the couchdb server?

What you are doing here is writing a view, the results of which will only
be regenerated if a new document has been inserted between a previous query
and the current query.

Jean-Felix Girard

unread,
Jan 8, 2014, 9:42:55 AM1/8/14
to us...@couchdb.apache.org
Hi,
To get server time from the client, I use a update function... You could do something like this:
{
"_id": "_design/js",
"_rev": "2-17d3cd5c245d45d1232ee95176d2e792",
"language": "javascript",
"updates": {
"time": "function(doc, req) { return [null, Math.round(new Date().getTime()/1000) + ''];}"
}
}
and query it like that:

curl localhost:5984/data_test/_design/js/_update/time -X POST
1389192069
~:$

Jeff

Filippo Fadda

unread,
Jan 8, 2014, 9:44:37 AM1/8/14
to us...@couchdb.apache.org
I suggest to generate the timestamp when you save the document, not when you index it.

-Filippo

Dave Cottlehuber

unread,
Jan 8, 2014, 11:07:45 AM1/8/14
to us...@couchdb.apache.org
It seems this is a common request; instead of computing it expensively in
JS, perhaps you'd like to open a jira ticket at
https://issues.apache.org/jira/browse/COUCHDB with some use case details,
and we could generate it using a cheap & efficient erlang function, and
include its output in e.g. GET / .

A+
Dave

Hank Knight

unread,
Jan 8, 2014, 1:58:53 PM1/8/14
to us...@couchdb.apache.org
I want to get the current timestamp according to the CouchDB server
using a GET request. When new documents are created, an update
function is used to add a timestamp to a document. When I get a
result set, it is important to know the server's current timestamp so
the age of the documents in the result set can be correctly
determined.

Stanley Iriele

unread,
Jan 8, 2014, 2:18:28 PM1/8/14
to us...@couchdb.apache.org
Maps should not be used for that... Also...why can't show or list functions
be used for that?...

Jean-Felix Girard

unread,
Jan 8, 2014, 2:40:09 PM1/8/14
to us...@couchdb.apache.org
I just noticed that Couchdb returns a "Date" response header.

< HTTP/1.1 200 OK
< Transfer-Encoding: chunked
< Server: CouchDB/1.5.0 (Erlang OTP/R16B02)
< ETag: "4E9MYK7J4X9CKM0EUK0V1K7IZ"
< Date: Wed, 08 Jan 2014 19:34:38 GMT
< Content-Type: text/plain; charset=utf-8
< Cache-Control: must-revalidate

You can parse that date (from the GET request on the view) and compare it to the document date to find out theirs age.

Jeff

Hank Knight

unread,
Jan 8, 2014, 3:46:04 PM1/8/14
to us...@couchdb.apache.org
I cannot use the headers because cross-domain issues. I need the
results to be returned in JSONP format with a callback.

Using a show function for this seems like a good idea but it does not
work either!

Here is an example. Notice how the time does not refresh!
https://zuhqtr5.couchappy.com/test/_design/showtimestamp/_show/serverTime

Here is my show function:

{
"_id": "_design/showtimestamp",
"shows": {
"timestamp": "function(doc, req) {return
''+String(Math.round(new Date().getTime()/1000));}",
"serverTime": "function(doc, req) {return
'serverTime({\"timestamp\": '+String(Math.round(new
Date().getTime()/1000))+'});';}"

Jean-Felix Girard

unread,
Jan 8, 2014, 3:54:21 PM1/8/14
to us...@couchdb.apache.org
try to add a random query parameter to your URL to avoid browser cache... if you use jQuery, you can set the ajax cache property to false. (it adds ?_=randomValue).

Stanley Iriele

unread,
Jan 8, 2014, 3:58:44 PM1/8/14
to us...@couchdb.apache.org
That's the browser cache... Not the JavaScript call you'll make... Try
making call...logging it to the console.. Then making that call again a
second later... It should work just fine.. You can even get the age from
the show function... With a new date minus created date and just return
that in a field

Hank Knight

unread,
Jan 8, 2014, 4:12:11 PM1/8/14
to us...@couchdb.apache.org
Thanks, you are right!
Reply all
Reply to author
Forward
0 new messages