<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>&#60;?blog &#187; index</title>
	<atom:link href="http://blog.visionsoftware.pl/tag/index/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.visionsoftware.pl</link>
	<description>...nie tylko o programowaniu</description>
	<lastBuildDate>Sun, 23 Mar 2014 19:23:43 +0000</lastBuildDate>
	<language>pl-PL</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	
	<item>
		<title>Indeksy TTL w MongoDB</title>
		<link>http://blog.visionsoftware.pl/bazy-danych/indeksy-ttl-w-mongodb.html</link>
		<comments>http://blog.visionsoftware.pl/bazy-danych/indeksy-ttl-w-mongodb.html#comments</comments>
		<pubDate>Sun, 23 Mar 2014 19:22:43 +0000</pubDate>
		<dc:creator><![CDATA[Marcin Fliszta]]></dc:creator>
				<category><![CDATA[Bazy danych]]></category>
		<category><![CDATA[index]]></category>
		<category><![CDATA[mongo]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[time to live]]></category>
		<category><![CDATA[ttl]]></category>

		<guid isPermaLink="false">http://blog.visionsoftware.pl/?p=643</guid>
		<description><![CDATA[MongoDB posiada bardzo ciekawą funkcjonalność w postaci automatycznego usuwania danych po upłynięciu określonego czasu. Wystarczy w tym celu utworzyć w kolekcji indeks TTL (ang. time to live). Dzięki temu można w niezwykle prosty sposób zaimplementować wygasające dane. Indeksy TTL możemy tworzyć na dwa różne sposoby. Możemy spowodować usunięcie  dokumentu po określonej liczbie sekund lub o określonym przez nas czasie. Usuwanie dokumentów po upłynięciu określonego czasu W tym przypadku należy utworzyć indeks na polu zawierającym datę, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>MongoDB posiada bardzo ciekawą funkcjonalność w postaci automatycznego usuwania danych po upłynięciu określonego czasu. Wystarczy w tym celu utworzyć w kolekcji indeks TTL (ang. <em>time to live</em>). Dzięki temu można w niezwykle prosty sposób zaimplementować wygasające dane.<span id="more-643"></span></p>
<p>Indeksy TTL możemy tworzyć na dwa różne sposoby. Możemy spowodować usunięcie  dokumentu po określonej liczbie sekund lub o określonym przez nas czasie.</p>
<h3>Usuwanie dokumentów po upłynięciu określonego czasu</h3>
<p>W tym przypadku należy utworzyć indeks na polu zawierającym datę, podając czas w sekundach, po jakim dokument zostanie usunięty.</p>
<p>Wyobraźmy sobie następującą, uproszczoną sytuację: w naszej aplikacji chcemy udostępniać jakieś zasoby, jednak wprowadzamy limit dla adresu IP. Powiedzmy, że użytkownik może coś pobrać raz na 10 minut. W naszej bazie informacje o fakcie pobrania będziemy przechowywali w następującej kolekcji:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
use downloads;
db.waiting.insert({createdAt: new Date(), ip: &quot;111.222.333.444&quot;});
db.waiting.insert({createdAt: new Date(), ip: &quot;555.666.777.888&quot;});
</pre>
<p>Jeśli chcemy aby nasze rekordy były kasowane z niej po 10 minutach wystarczy, że nałożymy następujący indeks TTL na pole z datą:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
db.waiting.ensureIndex( { &quot;createdAt&quot;: 1 }, { expireAfterSeconds: 600 } )
</pre>
<p>Po upłynięciu 600 sekund rekord zostanie automatycznie skasowany.</p>
<h3>Usuwanie dokumentów o określonym czasie</h3>
<p>Indeks TTL możemy także skonfigurować odwrotnie, tj. podając dokładny czas, w jakim dokument ma zostać skasowany. W tym celu należy na pole z datą ustawić indeks z wartością <code>expireAfterSeconds</code> ustawioną na 0:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
db.premium.ensureIndex( { &quot;expireAt&quot;: 1 }, { expireAfterSeconds: 0 } )
</pre>
<p>Jeśli data ustawiona w polu <code>expireAt</code> minie, to dokument zostanie automatycznie skasowany.</p>
<h3>Kilka dodatkowych informacji</h3>
<p>W przypadku korzystania z opisanej funkcjonalności, warto pamiętać o tym, że:</p>
<ul>
<li>Nie można nałożyć indeksu TTL na pole <code>_id</code>.</li>
<li>Indeks TTL nie może być ustawiony na pole, które posiada już inny indeks.</li>
<li>Dokument nie zostanie usunięty, jeśli nie będzie on posiadał zaindeksowanego pola (nie będzie w nim istniało pole z datą).</li>
<li>Dokument nie wygaśnie, jeśli zaindeksowane pole nie będzie pojedynczą datą lub tablicą dat w formacie BSON.</li>
<li>Indeksy TTL mogą być tylko proste (muszą składać się z jednego pola).</li>
<li>Jeśli indeks TTL został nałożony na tablicę, w której są daty, to dokument wygaśnie po uwzględnieniu najwcześniejszej z nich.</li>
<li>Nie można nałożyć indeksu TTL w <em>capped collection</em> (specjalna kolekcja, w której dane nadpisują się automatycznie).</li>
<li>Nie można użyć <code>ensureIndex()</code> w celu zmiany parametru <code>expireAfterSeconds</code>.</li>
<li>W przypadku tworzenia indeksu TTL typu <em>background</em>, dokumenty mogą być kasowane już w trakcie jego budowania. Jeśli będziemy go tworzyć jako <em>foreground</em>, dokumenty będą kasowane po jego zbudowaniu.</li>
<li>W przypadku używania indeksu TTL na zreplikowanych bazach, zostanie on uaktywniony tylko na <em>primary</em>. Dane zostaną usunięte z serwerów <em>secondary</em> podczas synchronizacji.</li>
</ul>
<h3></h3>
<h3>Dlaczego dane nie kasują się od razu?</h3>
<p>Przeprowadzając testy indeksów TTL z ustawionymi krótkimi czasami usunięcia dokumentów (np. kilkadziesiąt sekund) można dojść do wniosku, że nie wygasają one tak jak powinny. Dzieje się tak dlatego, że proces kasujący dane jest wywoływany co 60 sekund. Z tego względu dokumenty mogą zostać usunięte w krótkim czasie po upłynięciu terminu (działanie nie rozpoczyna się natychmiastowo).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.visionsoftware.pl/bazy-danych/indeksy-ttl-w-mongodb.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
