Refreshing documents in RavenDB
Once you put a document inside RavenDB, this is pretty much it, as far as RavenDB is concerned. It will keep your data safe, allow to query it, etc. But it doesn’t generally act upon it. There are a few exceptions, however.
RavenDB supports the @expires metadata attribute. This attribute allows you to specify a specific time in which RavenDB will automatically delete the document. This is very useful for expiring documents. The classic example being a password reset token, which should be valid for a period of time and then removed.
Here is what this looks like:
And you can configure the frequency in which we’ll check for expired documents in the studio.
Expiring documents, however, isn’t all that RavenDB can do. RavenDB also has an additional feature, refreshing documents. You can mark a document to be refreshed by specifying the @refresh metadata attribute, like so:
It is easy to understand what @expires do. At a given time, it will delete the document, because it expired. But what does refresh do? Well, at the specified time, a document with the @refresh metadata attribute will be updated by RavenDB to remove the @refresh metadata attribute from the document.
Yep, that is all. In other words, the document above would turn into:
That is all. Surely this is the most useless feature ever. You set a property that will be removed at a future time, but the only thing that the property can say is when to remove itself. What kind of feature is this?
Well, this is a case where by itself, this would be a pretty useless feature. But the point of this feature is that this will cause the document to be updated. At that point, it is a normal update, which means that:
- The document will be re-indexed.
- The document will be sent over ETL.
- The document will be sent to the relevant subscriptions.
The last point is the most important one. Here is an example of a typical subscription:
As you can see, this is a pretty trivial subscription, but it filters out commands that are set to refresh. What does this mean? It means that if the @refresh attribute is set, we’ll ignore the document. But since RavenDB will automatically clear the attribute when the refresh timer is hit, we gain a powerful ability.
We now have the ability to process delayed commands. In other words, you can save a document with a refresh and have it processed by a subscription at a given time.
Expanding on this, you can do the same using ETL. So you have a document that will be sent over to the ETL destination at a given time. You can also do the same for indexing as well.
And now this seemingly trivial / useless feature become a pivot for a whole new set of capabilities that you get with RavenDB.
Comments
I'm really trying to get this feature to work but the last statement works as a query on 4.2.8 but when trying to use the same statement as a subscription gives an "Esprima.ParserException: Line 2: Unexpected token ILLEGAL"
Steve,
Try using:
Doesn't seem to work either (even only for checking @metadata):
Raven.Client.Exceptions.InvalidQueryException: Expected to find closing ']' after 'c['. Query: from PersonContracts as c where c["@metadata"] == null at Raven.Server.Documents.Queries.Parser.QueryParser.ThrowInvalidQueryException(String message, Exception e) in C:\Builds\RavenDB-Stable-4.2\42034\src\Raven.Server\Documents\Queries\Parser\QueryParser.cs:line 955
I get a similar error when running the query not as a subscription.
Steve, I opened an issue for that. In the meantime, sorry, but use this:
Super, that one works, this should get me started :)
Comment preview