2021-07-06に更新

📝 Azure Cosmos DB でソートしようとするとフリーズする

MongoDB 用 API で Azure CosmosDB 向けの開発を行っていたのですが、sort 実行時にエラーが発生してしまいリソースが取得できなくなる問題が発生してしまいました。

結論から言ってしまうと、この Stack Overflow の回答 通り対処すれば解決可能なのですが、簡易的に日本語でも解決策を記しておきます。

また、本記事内容の問題に遭遇したときに見つけたのですが、事前に Azure CosmosDB の Docker イメージ を利用しておけば、CosmosDB 特有の挙動に気づけるようになるかもしれません。私は MongoDB の Docker イメージ を利用して開発や動作検証を行っておりました。


公式サイトでの MongoDB 用 API でのインデックス管理 についての記事を見ていくと下記の文言が出てきます。

クエリに並べ替えを適用するには、並べ替え操作で使用されるフィールドに対してインデックスを作成する必要があります。

そのため、例えば MongoDB の ORM である Mongoose の利用例でいうと、スキーマを定義する際に下記のようにソートに利用したいキーに対してインデックスを指定する必要があります。

@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;

また、範囲検索を行いたい場合は各キーにインデックスを作成することで可能になります。

@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;

地味な Tips のような記事ですが、割とハマりました。。この記事が同じ轍を踏んでしまっている方の参考になれれば幸いです 😇

Originally published at nikaera.com
ツイッターでシェア
みんなに共有、忘れないようにメモ

nikaera

xR企業でエンジニアやってます!主にプログラミングとゲームと音楽の話題を投稿します。サーバーサイドや Web 周りが主戦場ですが、最近は Standalone VR や WebXR に興味津々です。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント