端くれプログラマの備忘録 MongoDB [MongoDB] MongoDB Shell チュートリアル

[MongoDB] MongoDB Shell チュートリアル

公式サイトのチュートリアルをなぞる。

The MongoDB 3.4 Manual — MongoDB Manual 3.4
https://docs.mongodb.com/manual/

サンプルデータセットのインポート

$ cd ~
$ mkdir temp
$ curl https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json > primer-dataset.json
$ mongoimport --db test --collection restaurants --drop --file ~/temp/primer-dataset.json

MongoDB Shell起動

$ mongo

コマンド一覧

> help

データベース選択

> use test
switched to db test

ドキュメント追加

> db.restaurants.insert(
...    {
...       "address" : {
...          "street" : "2 Avenue",
...          "zipcode" : "10075",
...          "building" : "1480",
...          "coord" : [ -73.9557413, 40.7720266 ]
...       },
...       "borough" : "Manhattan",
...       "cuisine" : "Italian",
...       "grades" : [
...          {
...             "date" : ISODate("2014-10-01T00:00:00Z"),
...             "grade" : "A",
...             "score" : 11
...          },
...          {
...             "date" : ISODate("2014-01-16T00:00:00Z"),
...             "grade" : "B",
...             "score" : 17
...          }
...       ],
...       "name" : "Vella",
...       "restaurant_id" : "41704620"
...    }
... )
WriteResult({ "nInserted" : 1 })

全ドキュメント取得

> db.restaurants.find()

条件指定

> db.restaurants.find( { "borough": "Manhattan" } )
> db.restaurants.find( { "address.zipcode": "10075" } ) // 埋め込みドキュメント中のフィールド
> db.restaurants.find( { "grades.grade": "B" } ) // 配列中のフィールド
> db.restaurants.find( { "grades.score": { $gt: 30 } } ) // コンディション指定
> db.restaurants.find( { "grades.score": { $lt: 10 } } )
> db.restaurants.find( { "cuisine": "Italian", "address.zipcode": "10075" } ) // AND条件
> db.restaurants.find( { $or: [ { "cuisine": "Italian" }, { "address.zipcode": "10075" } ] } ) // OR条件

ソート (1: ascending, -1: descending)

> db.restaurants.find().sort( { "borough": 1, "address.zipcode": 1 } )

更新

> db.restaurants.update(
...     { "name" : "Juni" }, // ドキュメント指定
...     {
...       $set: { "cuisine": "American (New)" }, // トップレベルフィールドの更新
...       $currentDate: { "lastModified": true } // 現在時刻セット
...     }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.restaurants.update(
...   { "restaurant_id" : "41156888" }, // ドキュメント指定
...   { $set: { "address.street": "East 31st Street" } } // 埋め込みフィールドの更新
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.restaurants.update(
...   { "address.zipcode": "10016", cuisine: "Other" },
...   {
...     $set: { cuisine: "Category To Be Determined" },
...     $currentDate: { "lastModified": true }
...   },
...   { multi: true} // 複数ドキュメントの更新
... )
WriteResult({ "nMatched" : 20, "nUpserted" : 0, "nModified" : 20 })

ドキュメントの置換 – update()の第二引数に新しいドキュメントを指定する

> db.restaurants.update(
...    { "restaurant_id" : "41704620" },
...    {
...      "name" : "Vella 2",
...      "address" : {
...               "coord" : [ -73.9557413, 40.7720266 ],
...               "building" : "1480",
...               "street" : "2 Avenue",
...               "zipcode" : "10075"
...      }
...    }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

ドキュメントの削除 (1件)

> db.restaurants.remove( { "borough": "Queens" }, { justOne: true } )
WriteResult({ "nRemoved" : 1 })

ドキュメントの削除 (全件)

> db.restaurants.remove( { } )
WriteResult({ "nRemoved" : 25359 })

コレクションの削除

> db.restaurants.drop()
true

グルーピング

> db.restaurants.aggregate(
...    [
...      { $group: { "_id": "$borough", "count": { $sum: 1 } } }
...    ]
... );
{ "_id" : "Missing", "count" : 51 }
{ "_id" : "Staten Island", "count" : 969 }
{ "_id" : "Brooklyn", "count" : 6086 }
{ "_id" : "Bronx", "count" : 2338 }
{ "_id" : "Queens", "count" : 5656 }
{ "_id" : "Manhattan", "count" : 10259 }

絞り込み結果をグルーピング

> db.restaurants.aggregate(
...    [
...      { $match: { "borough": "Queens", "cuisine": "Brazilian" } },
...      { $group: { "_id": "$address.zipcode" , "count": { $sum: 1 } } }
...    ]
... );
{ "_id" : "11377", "count" : 1 }
{ "_id" : "11103", "count" : 1 }
{ "_id" : "11106", "count" : 3 }
{ "_id" : "11368", "count" : 1 }
{ "_id" : "11101", "count" : 2 }

インデックス作成 (シングルフィールド)

> db.restaurants.createIndex( { "cuisine": 1 } )
{
     "createdCollectionAutomatically" : false,
     "numIndexesBefore" : 1,
     "numIndexesAfter" : 2,
     "ok" : 1
}

インデックス作成 (複合)

> db.restaurants.createIndex( { "cuisine": 1, "address.zipcode": -1 } )
{
     "createdCollectionAutomatically" : false,
     "numIndexesBefore" : 2,
     "numIndexesAfter" : 3,
     "ok" : 1
}