MongoDB: mongoシェルでのクエリ


前提


ドキュメント


findメソッドでクエリ

db.コレクション.find(クエリ, プロジェクション)


Cursorオブジェクトのイテレート

REPL

> db.sample1.find() // 最初の20件

> it // 次の20件
no cursor // もうないとき

スクリプト

db.sample1.find().forEach(printjson)

_idフィールド

各ドキュメントには_idフィールドが自動付与される。

db.books.insert(
  [{タイトル:'吾輩はネコ'}, {タイトル:'ワレワレは宇宙人'}, {タイトル:'おらゴクウ'}]
)
db.books.find().forEach(printjson)
{ "_id" : ObjectId("5e01cea5e3db865180719f4a"), "タイトル" : "吾輩はネコ" }
{ "_id" : ObjectId("5e01cea5e3db865180719f4b"), "タイトル" : "ワレワレは宇宙人" }
{ "_id" : ObjectId("5e01cea5e3db865180719f4c"), "タイトル" : "おらゴクウ" }

ObjectId型

> let id = ObjectId() // 新規作成
> id
ObjectId("5e01d3ead3cd85a615be8739")
> id.str
5e01d3ead3cd85a615be8739

_idで検索

クエリ = {_id: ObjectId("24桁")}
db.books.find({_id: ObjectId("5e133df0e01bb797da1a5d90")}) // 例

フィールドを一つ以上指定して一致検索

クエリ = {フィールド1:値, フィールド2:値, ...}
db.sample.insert([
  {フィールド1:'a', フィールド2:'xyz'},
  {フィールド1:'a', フィールド2:'b', フィールド3:'c'},
])

db.sample.find({フィールド2:'xyz'}).forEach(printjson)
// {フィールド1:'a', フィールド2:'xyz'},

print()

db.sample.find({フィールド3:'c', フィールド1:'a'}).forEach(printjson)
// {フィールド1:'a', フィールド2:'b', フィールド3:'c'},
クエリ = { $and: [{フィールド1:値}, {フィールド2:値}, ...] }

比較オペレータ

クエリ = { フィールド: { オペレータ: 表現 } }

値が一致するかどうか

db.sample.insert([
  {フィールド1:'a', フィールド2:'xyz'},
  {フィールド1:'a', フィールド2:'b', フィールド3:'c'},
])
let クエリ = { フィールド2: { $ne:'b' } } // 一致しないもの
db.sample.find(クエリ).forEach(printjson)
// {フィールド1:'a', フィールド2:'xyz'},

値の大小

db.sample.insert([
  {価格:60}, {価格:70}, {価格:85}
])
let クエリ = { 価格: { $lt:70 } } // 70未満
db.sample.find(クエリ).forEach(printjson)
// {価格:60}

値を含むかどうか

db.sample.insert([
  {価格:60}, {価格:70}, {価格:85}
])
let クエリ = { 価格: { $in: [70, 85] } } // 70か85
db.sample.find(クエリ).forEach(printjson)
// {価格:70}, {価格:85}

フィールドが存在するかどうかでマッチ: $exists

db.sample.insert([
  {値段:60}, {値段:null}, {お値段:85}
])
let クエリ = { 値段: { $exists:true } }
db.sample.find(クエリ).forEach(printjson)
// {値段:60}, {値段:null}

正規表現: $regex

クエリ = { フィールド: { $regex: /正規表現/ } }
// または
クエリ = { フィールド: /正規表現/ }
db.sample.insert([
  {アイテム:'りんごジュース'},
  {アイテム:'りんごアイス'},
  {アイテム:'アイスコーヒー'}
])

let クエリ = { アイテム: /アイス$/ }
db.sample.find(クエリ).forEach(printjson)
// {アイテム:'りんごアイス'},

OR検索

クエリ = { $or: [{フィールド1:値}, {フィールド2:値}, ...] }
db.sample.insert([
  {種類:'アイス', 名前:'いちご', 価格:100},
  {種類:'アイス', 名前:'バナナ', 価格:200},
  {種類:'アイス', 名前:'チョコ', 価格:300},
  {種類:'ケーキ', 名前:'チョコ', 価格:400},
])

// AND検索とOR検索を組み合わせたもの
// 種類アイス、かつ、「価格200未満または名前チョコ」
let クエリ = {
  種類:'アイス',
  $or: [{価格:{$lt:200}}, {名前:'チョコ'}]
}

db.sample.find(クエリ).forEach(printjson)
// いちごアイス、チョコアイス

配列のクエリ

$all: 要素すべて含む

クエリ = { フィールド: { $all: [要素1, 要素2, ...] } }
db.sample.insert([
  {Linux: ['openSUSE', 'Ubuntu']},
  {Linux: ['Alpine', 'Debian', 'Fedora']},
  {Linux: ['CentOS', 'Ubuntu', 'Alpine',]},
])

let クエリ = { Linux: { $all: ['Alpine', 'Ubuntu'] } }

db.sample.find(クエリ).forEach(printjson)
// {Linux: ['CentOS', 'Ubuntu', 'Alpine',]},

$size: 配列サイズ

クエリ = { Linux: { $size:2 } }
db.sample.find(クエリ).forEach(printjson)
// {Linux: ['openSUSE', 'Ubuntu']},

$elemMatch: 要素クエリのどれかにマッチ

クエリ = {
  フィールド: { $elemMatch: {クエリ1, クエリ2, ...} }
}
// openSUSEを含む、または、Ubuntuを含まない
クエリ = {
  Linux: { $elemMatch: {$eq:'openSUSE', $ne:'Ubuntu'} }
}
db.sample.find(クエリ).forEach(printjson)
// {Linux: ['openSUSE', 'Ubuntu']},

要素のインデックス番号を指定

クエリ = { "フィールド.インデックス": 要素 }
クエリ = { "Linux.0": 'Alpine' }

db.sample.find(クエリ).forEach(printjson)
// {Linux: ['Alpine', 'Debian', 'Fedora']},

ネストしたフィールドのクエリ

db.sample.insert([
  {Linux: {command:'cat'}},
  {Linux: {command:'pwd'}},
])

let クエリ = { "Linux.command": 'pwd' }

db.sample.find(クエリ).forEach(printjson)
// {Linux: {command:'pwd'}},