tag:crieit.net,2005:https://crieit.net/tags/Content/feed 「Content」の記事 - Crieit Crieitでタグ「Content」に投稿された最近の記事 2021-01-06T08:13:26+09:00 https://crieit.net/tags/Content/feed tag:crieit.net,2005:PublicArticle/16543 2021-01-06T08:13:26+09:00 2021-01-06T08:13:26+09:00 https://crieit.net/posts/Nuxt-Content-5ff4f2969eba2 Nuxt/Contentで日付による範囲検索をしたい <p>ハマりにハマった。</p> <h2 id="Nuxt/Content"><a href="#Nuxt%2FContent">Nuxt/Content</a></h2> <p>最近、Nuxt/Contentというものをお試しで触っている。<br /> Markdownとかでコンテンツをゴリゴリ書いていける、GitベースのヘッドレスCMSとかいうものになるらしい。「GitベースのヘッドレスCMS」とか言われてもよくわからないが、DBではなくGitで管理するということだと思う。<br /> 検索とか、なんなら全文検索もできるし結構便利そう。<br /> ただ、<a target="_blank" rel="nofollow noopener" href="https://content.nuxtjs.org/ja">公式ドキュメント</a>以外に日本語の記事が乏しくて、ちょっと苦戦する。<br /> ちょっと、というか、どハマりしてしまった。</p> <h2 id="ハマった環境"><a href="#%E3%83%8F%E3%83%9E%E3%81%A3%E3%81%9F%E7%92%B0%E5%A2%83">ハマった環境</a></h2> <ul> <li>Nuxt: 2.14.6</li> <li>nuxt/content: 1.9.0</li> </ul> <h2 id="日付でコンテンツを絞りたい"><a href="#%E6%97%A5%E4%BB%98%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%82%92%E7%B5%9E%E3%82%8A%E3%81%9F%E3%81%84">日付でコンテンツを絞りたい</a></h2> <p>作成日でコンテンツを絞りたかったので、<a target="_blank" rel="nofollow noopener" href="https://content.nuxtjs.org/ja/fetching#wherequery">ドキュメント</a>を参考にクエリを書いた。<br /> ただ、日付の扱い方がよくわからなかったので嫌な予感はしていた。</p> <pre><code class="javascript">// 例)2020/11の記事を検索したい const monthStart = new Date("2020-11-01") const monthEnd = new Date("2020-11-30") const articles = await $content('articles') .sortBy('createdAt', 'desc') .limit(5) .where({ createdAt: { $and: [{ $gte: monthStart }, { $lte: monthEnd }] }, }) .fetch() </code></pre> <p>これで11月に作成した記事の最新5件が取れるはずだった。</p> <h2 id="けど取れない"><a href="#%E3%81%91%E3%81%A9%E5%8F%96%E3%82%8C%E3%81%AA%E3%81%84">けど取れない</a></h2> <p>変数articlesの中身は空でした。なんで?<br /> もしかしてDateじゃないのかなとか思って日付形式っぽい文字列にしてみてもダメ。<br /> 公式ドキュメントを探し直したけど、特に記述はなく……。<br /> なんなら</p> <blockquote> <p>createdAt: DateTime</p> </blockquote> <p>とか<a target="_blank" rel="nofollow noopener" href="https://content.nuxtjs.org/ja/writing#%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%83%9E%E3%82%BF%E3%83%BC">書いてある</a>し、どう考えたってDateでしょ。</p> <h2 id="調べた"><a href="#%E8%AA%BF%E3%81%B9%E3%81%9F">調べた</a></h2> <p>先述の通り、日本語の記事が乏しいうえ、公式ドキュメントに記載がないので苦戦したのだけど、調べて、見つけた。<br /> あったよ。<br /> ていうか、<a target="_blank" rel="nofollow noopener" href="https://github.com/nuxt/content/issues/437">GitHubのissue</a>だったよ!<br /> まあ、内容としてはissueそのまんまなんだけど、</p> <pre><code class="js">// 例)2020/11の記事を検索したい const monthStart = new Date("2020-11-01").valueOf() const monthEnd = new Date("2020-11-30").valueOf() const articles = await $content('articles') .sortBy('createdAt', 'desc') .limit(5) .where({ createdAt: { $and: [{ $gte: monthStart }, { $lte: monthEnd }] }, }) .fetch() </code></pre> <p>valueOf()なんて初めて使ったよ。てか、初めて知ったよ。<br /> と思って<a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/valueOf">調べてみたら</a>、getTime()の方が正しい気がしてきたぞ?</p> <blockquote> <p>このメソッドは、Date.prototype.getTime() メソッドと機能的に同等です。<br /> このメソッドは、JavaScript によって内部的に呼ばれ、コード内で明示的に呼ばれることはありません。</p> </blockquote> <pre><code class="js">// 例)2020/11の記事を検索したい const monthStart = new Date("2020-11-01").getTime() const monthEnd = new Date("2020-11-30").getTime() const articles = await $content('articles') .sortBy('createdAt', 'desc') .limit(5) .where({ createdAt: { $and: [{ $gte: monthStart }, { $lte: monthEnd }] }, }) .fetch() </code></pre> <p>うん、これでも動いた。</p> <p>あー、UNIXタイムスタンプだったかー。ドキュメントに書いてて欲しいなー。</p> <h2 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h2> <p>issuesにはあったけど、日本語の記事があっても良いと思ったので書きました。<br /> 探し方が悪いだけかもしれませんが。</p> hammhiko