mongoDB whereを使用する

mongoDB whereを使用する

mongoDBで、whereを使用する手順を記述してます。「find」で「$where」を使用します。mongoDBでも一般的なリレーショナルデータベースのように「where」を使用してデータを抽出することできます。

環境

  • OS CentOS Stream release 9
  • MongoDB 6.0.2

手順

実行計画を取得するには、「$where」を使用します。

db.コレクション名.find( { $where: "条件" } )

実際に、以下のデータベース「hoge」にある「foo」というコレクション(テーブル)のドキュメント(レコード)を使用して動作を確認してみます。

> use hoge

> db.foo.find()

[
  {
    _id: ObjectId("6368bc09cbd6720d0fb92c2d"),
    name: 'itiro',
    age: 10,
    gender: 'm'
  },
  {
    _id: ObjectId("6368bc09cbd6720d0fb92c2e"),
    name: 'jiro',
    age: 20,
    gender: 'm'
  },
  {
    _id: ObjectId("6368bc09cbd6720d0fb92c2f"),
    name: 'saburo',
    age: 30,
    gender: 'm'
  },
  {
    _id: ObjectId("6368bc09cbd6720d0fb92c30"),
    name: 'jiro',
    age: 25,
    gender: 'f'
  },
  {
    _id: ObjectId("6368bc09cbd6720d0fb92c31"),
    name: 'jiro',
    age: 30,
    gender: 'x'
  }
]

「10」より大きいのデータだけ取得してみます。

> db.foo.find({$where: "this.age > 10"})

[
  {
    _id: ObjectId("6368bc09cbd6720d0fb92c2e"),
    name: 'jiro',
    age: 20,
    gender: 'm'
  },
  {
    _id: ObjectId("6368bc09cbd6720d0fb92c2f"),
    name: 'saburo',
    age: 30,
    gender: 'm'
  },
  {
    _id: ObjectId("6368bc09cbd6720d0fb92c30"),
    name: 'jiro',
    age: 25,
    gender: 'f'
  },
  {
    _id: ObjectId("6368bc09cbd6720d0fb92c31"),
    name: 'jiro',
    age: 30,
    gender: 'x'
  }
]

取得されていることが、確認できます。

and条件も使用できます。

> db.foo.find({$where: "this.age > 10 && this.age <= 25"})

[
  {
    _id: ObjectId("6368bc09cbd6720d0fb92c2e"),
    name: 'jiro',
    age: 20,
    gender: 'm'
  },
  {
    _id: ObjectId("6368bc09cbd6720d0fb92c30"),
    name: 'jiro',
    age: 25,
    gender: 'f'
  }
]

or条件は、以下となります。

> db.foo.find({$where: "this.age >= 30 || this.age == 25"})

[
  {
    _id: ObjectId("6368bc09cbd6720d0fb92c2f"),
    name: 'saburo',
    age: 30,
    gender: 'm'
  },
  {
    _id: ObjectId("6368bc09cbd6720d0fb92c30"),
    name: 'jiro',
    age: 25,
    gender: 'f'
  },
  {
    _id: ObjectId("6368bc09cbd6720d0fb92c31"),
    name: 'jiro',
    age: 30,
    gender: 'x'
  }
]