tag:crieit.net,2005:https://crieit.net/tags/mongoose/feed
「mongoose」の記事 - Crieit
Crieitでタグ「mongoose」に投稿された最近の記事
2021-07-06T00:51:27+09:00
https://crieit.net/tags/mongoose/feed
tag:crieit.net,2005:PublicArticle/17487
2021-07-06T00:47:48+09:00
2021-07-06T00:51:27+09:00
https://crieit.net/posts/azure-cosmos-db-sort
📝 Azure Cosmos DB でソートしようとするとフリーズする
<p><a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/azure/cosmos-db/mongodb-introduction">MongoDB 用 API</a> で Azure CosmosDB 向けの開発を行っていたのですが、<code>sort</code> 実行時にエラーが発生してしまいリソースが取得できなくなる問題が発生してしまいました。</p>
<p>結論から言ってしまうと、この <a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/a/60809868">Stack Overflow の回答</a> 通り対処すれば解決可能なのですが、簡易的に日本語でも解決策を記しておきます。</p>
<p>また、本記事内容の問題に遭遇したときに見つけたのですが、事前に <a target="_blank" rel="nofollow noopener" href="https://hub.docker.com/r/microsoft/azure-cosmosdb-emulator/">Azure CosmosDB の Docker イメージ</a> を利用しておけば、CosmosDB 特有の挙動に気づけるようになるかもしれません。私は <a target="_blank" rel="nofollow noopener" href="https://hub.docker.com/_/mongo">MongoDB の Docker イメージ</a> を利用して開発や動作検証を行っておりました。</p>
<hr />
<p>公式サイトでの <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/azure/cosmos-db/mongodb-indexing">MongoDB 用 API でのインデックス管理</a> についての記事を見ていくと下記の文言が出てきます。</p>
<blockquote>
<p>クエリに並べ替えを適用するには、並べ替え操作で使用されるフィールドに対してインデックスを作成する必要があります。</p>
</blockquote>
<p>そのため、例えば MongoDB の ORM である <a target="_blank" rel="nofollow noopener" href="https://mongoosejs.com/">Mongoose</a> の利用例でいうと、スキーマを定義する際に下記のようにソートに利用したいキーに対してインデックスを指定する必要があります。</p>
<pre><code class="typescript">@Schema({ timestamps: { createdAt: "created_at", updatedAt: "updated_at" } })
export class TestSchema1 extends Document {
_id: string;
// ソートしたいキーには index を付ける
@Prop({ index: true })
sort!: number;
}
const schema = SchemaFactory.createForClass(TestSchema1);
export const TestSchema1 = schema;
</code></pre>
<p>また、範囲検索を行いたい場合は各キーにインデックスを作成することで可能になります。</p>
<pre><code class="typescript">@Schema({ timestamps: { createdAt: "created_at", updatedAt: "updated_at" } })
export class TestSchema2 extends Document {
_id: string;
@Prop()
start_at: Date;
@Prop()
end_at: Date;
}
// start_at と end_at で範囲検索を行いたいため、
// それぞれに unique インデックスを作成している
const schema = SchemaFactory.createForClass(TestSchema2)
.index({ start_at: 1 }, { unique: true })
.index({ end_at: 1 }, { unique: true });
export const TestSchema2 = schema;
</code></pre>
<p>地味な Tips のような記事ですが、割とハマりました。。この記事が同じ轍を踏んでしまっている方の参考になれれば幸いです 😇</p>
nikaera