MongoDBの基本操作ガイド

MongoDBにおける基本的な操作には、ドキュメントの作成、削除、更新が含まれます。

ドキュメントの挿入

1、挿入操作

#現在利用可能なデータベースの一覧表示
> show dbs;
local  0.000GB
sample  0.000GB
#sampleデータベースを使用
> use sample;
switched to db sample
#コレクションの一覧表示
> show collections;
employees
> db.employees.in
db.employees.initializeOrderedBulkOp(    db.employees.insert(                     db.employees.insertOne(
db.employees.initializeUnorderedBulkOp(  db.employees.insertMany(
#insertメソッドを使用してドキュメントを挿入、{}で囲み、キーと値のペアで表現される
> db.employees.insert({"emp_id":1001,"name":"田中太郎","age":32,"position":"開発者"})
WriteResult({ "nInserted" : 1 })
> 

2、クエリ操作

#find()メソッドを使用してクエリを実行
> db.employees.find()
{ "_id" : ObjectId("575f039f0c73a5a96e8f7c8f"), "emp_id" : 1001, "name" : "田中太郎", "age" : 32, "position" : "開発者" }
> 

3、多数のドキュメントを効率的に作成する方法

JSONのループを利用して実現できます

> for(i=1002;i<=1020;i++){
... db.employees.insert({"emp_id":i,"name":"従業員"+i,"salary":300000+Math.round(Math.random())*200000})
... }
WriteResult({ "nInserted" : 1 })
> 

まとめ:

単一のドキュメントを挿入するにはinsertメソッドを使用します

ドキュメントのルールはキーと値のペアであり、それらはペアで出現します。キーと値はコロンで区切られ、ペア間はコンマで区切られます。

ドキュメントの削除

1、全件検索

#db.employees.find() 括弧内に条件を指定しない場合は、デフォルトですべてのドキュメントが表示されます

2、条件付き検索

> db.employees.find({"emp_id":1001}) #ここで条件を指定
{ "_id" : ObjectId("575f039f0c73a5a96e8f7c8f"), "emp_id" : 1001, "name" : "田中太郎", "age" : 32, "position" : "開発者" }

3、ドキュメントの削除

> db.employees.remove({"emp_id":1001})
WriteResult({ "nRemoved" : 1 })  #removedが1の場合、削除が成功したことを示します

4、コレクションのクリア

> db.employees.remove({})
WriteResult({ "nRemoved" : 19 })

5、コレクションの削除

> db.employees.drop()
true  #trueが返された場合は削除が成功したことを示します

ドキュメントの更新

先ほど削除したドキュメントを再作成します:

for(i=1002;i<=1020;i++){ db.employees.insert({"emp_id":i,"name":"従業員"+i,"salary":300000+Math.round(Math.random())*200000}) }

1、ドキュメントの更新

ドキュメントを更新するには、updateメソッドの括弧内で、最初のドキュメントが検索条件、2番目のドキュメントが更新後の内容です!

> db.employees.update({"emp_id":1002},{"name":"鈴木一郎"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

この更新方法では、後続のドキュメントが更新対象のドキュメント全体を上書きしてしまいます。以下のようになります。emp_idフィールドとsalaryフィールドが上書きされています

> db.employees.find()
{ "_id" : ObjectId("575f068e0c73a5a96e8fca3"), "name" : "鈴木一郎" }

したがって、以下の方法を使用できます

>  db.employees.update({"emp_id":1003},{"emp_id" : 1003, "name" : "鈴木一郎", "salary" : 350000 })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.employees.findOne({"emp_id":1003})
{
        "_id" : ObjectId("575f068e0c73a5a96e8fca4"),
        "emp_id" : 1003,
        "name" : "鈴木一郎",
        "salary" : 350000
}
> 

この更新結果は私たちが望む結果です。この方法はドキュメントの置換方式による更新と呼ばれます!

しかし、emp_idは変更せず、salaryも変更しない場合でも、すべてのフィールドを記述する必要があります!

2、変数を使用した更新方法

取得した値を変数に割り当て、その変数を使用して修正できます!

#取得した値を変数aに割り当て
> a = db.employees.findOne({"emp_id":1004})
{
        "_id" : ObjectId("575f068e0c73a5a96e8fca5"),
        "emp_id" : 1004,
        "name" : "従業員1004",
        "salary" : 450000
}
> a.name
従業員1004
#変数.フィールド名を使用してフィールドの内容を変更
> a.name="佐藤花子"
佐藤花子
> db.employees.findOne({"emp_id":1004})
{
        "_id" : ObjectId("575f068e0c73a5a96e8fca5"),
        "emp_id" : 1004,
        "name" : "従業員1004",
        "salary" : 450000
}
#その後updateで更新
> db.employees.update({"emp_id":1004},a)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.employees.findOne({"emp_id":1004})
{
        "_id" : ObjectId("575f068e0c73a5a96e8fca5"),
        "emp_id" : 1004,
        "name" : "佐藤花子",
        "salary" : 450000
}

その本質は依然として置換方式ですが、便利になっています

3、$inc修飾子を使用した更新

emp_idが1010のユーザーに給与を10000円増やすにはどうすればよいでしょうか

#$incはキーと値のペールのルールに従います。キーとして機能し、変更する内容が値です
> db.employees.update({"emp_id":1010},{"$inc":{"salary":10000}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

#結果
{ "_id" : ObjectId("575f068e0c73a5a96e8fcb"), "emp_id" : 1010, "name" : "従業員1010", "salary" : 410000 }

#10000円減らす
> db.employees.update({"emp_id":1010},{"$inc":{"salary":-10000}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

#結果
{ "_id" : ObjectId("575f068e0c73a5a96e8fcb"), "emp_id" : 1010, "name" : "従業員1010", "salary" : 400000 }

4、フィールドの追加$set修飾子

場合によっては、年齢などのフィールドを追加する必要があります。$setを使用します

#$set修飾子を使用
> db.employees.update({"emp_id":1010},{"$set":{"age":28}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

#結果
{ "_id" : ObjectId("575f068e0c73a5a96e8fcb"), "emp_id" : 1010, "name" : "従業員1010", "salary" : 400000, "age" : 28 }

5、フィールドの削除$unset修飾子

場合によっては、年齢などのフィールドを削除する必要があります。$unsetを使用します

#$unsetを使用する際は、値も辞書形式で、削除するフィールド:1 この1はtrueを意味し、削除します。この1は論理的なtrueです
> db.employees.update({"emp_id":1010},{"$unset":{"age":1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

#結果
{ "_id" : ObjectId("575f068e0c73a5a96e8fcb"), "emp_id" : 1010, "name" : "従業員1010", "salary" : 400000 }

$unsetを使用する際、ageの値が1であることはtrueを意味します。この1は論理的なtrueなので、値としてtrueを使用して削除することもできます。emp_idが1010のsalaryフィールドを削除してみましょう

#例
> db.employees.update({"emp_id":1010},{"$unset":{"salary":true}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
結果:
{ "_id" : ObjectId("575f068e0c73a5a96e8fcb"), "emp_id" : 1010, "name" : "従業員1010" }

6、ドキュメント更新のその他パラメータ

> db.employees.update({条件},{更新内容},オプション1,オプション2)
'''
条件:検索条件     #これで検索
更新内容:操作する更新内容      #見つかったドキュメントを変更
オプション1:
オプション2:
'''
#オプション3の役割は何ですか?
以下のような場合を見てみましょう:
emp_idが2000のデータを更新したいが、このemp_idが2000のドキュメントは存在しません
> db.employees.find({"emp_id":2000}) #空
では、今これを変更すると成功しますか?
> db.employees.update({"emp_id":2000},{"emp_id":2000,"name":"新人2000","salary":250000})
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
#上記の表示から、0件見つかり、0件変更されたことがわかります。つまり、更新されていません。ここで3番目のパラメータの役割が登場します。trueに設定します
> db.employees.update({"emp_id":2000},{"emp_id":2000,"name":"新人2000","salary":250000},true)
WriteResult({
        "nMatched" : 0,
        "nUpserted" : 1, #見つからない場合、挿入します
        "nModified" : 0,
        "_id" : ObjectId("575f12ee7732f402fffdf61b")
})
> 
#確認すると、更新が成功しています
{ "_id" : ObjectId("575f12ee7732f402fffdf61b"), "emp_id" : 2000, "name" : "新人2000", "salary" : 250000 }

'''
したがって、3番目のパラメータの意味が明らかになります。条件が見つからない場合、更新内容を挿入します
'''


#オプション4の意味
現在、すべての従業員に50000円のボーナスを支給する必要があります。操作を見てみましょう
> db.employees.update({},{"$inc":{"salary":50000}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

#一致した最初のデータのみが更新されたことがわかります。4番目のパラメータの役割が登場します
> db.employees.update({},{"$inc":{"salary":50000}},false,true)
WriteResult({ "nMatched" : 20, "nUpserted" : 0, "nModified" : 20 })
> 
'''
上記から、4番目のパラメータをtrueに設定すると、すべてのドキュメントに一致することがわかります
'''

まとめ:

3番目と4番目のパラメータのデフォルト値はfalseです

最初のパラメータが検索条件、2番目が更新内容、3番目は条件が見つからない場合に更新内容を追加するかどうか、4番目はすべてのドキュメントに一致させるかどうかです。

ネストされたドキュメントと配列の更新

Pythonで言えば、辞書の中の辞書と、辞書の中のリストです!

まずドキュメントを作成し、それを変更して、ネストされたドキュメントと配列をどのように変更するか実際に見てみましょう

> db.employees.insert({"emp_id":1001,"name":"田中太郎","profile":{"dept":"技術部","code":10085,"ext":"1234"},"skills":[]})
WriteResult({ "nInserted" : 1 })
> db.employees.findOne()
{
        "_id" : ObjectId("575f19c45e4f17980e7b3366"),
        "emp_id" : 1001,
        "name" : "田中太郎",
        "profile" : {
                "dept" : "技術部",
                "code" : 10085,
                "ext" : "1234"
        },
        "skills" : [ ]
}
> 

一、配列の更新

1、配列に要素を追加する$push

> db.employees.update({"emp_id":1001},{"$push":{"skills":"JavaScript"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.employees.findOne()
{
        "_id" : ObjectId("575f19c45e4f17980e7b3366"),
        "emp_id" : 1001,
        "name" : "田中太郎",
        "profile" : {
                "dept" : "技術部",
                "code" : 10085,
                "ext" : "1234"
        },
        "skills" : [
                "JavaScript"
        ]
}
> 

$pushは配列に要素を追加し、配列の最後に要素を追加します

2、$pushAll 配列に複数の要素を追加しますが、要素が存在するかどうかをチェックしません

以下:Javaはすでに存在しますが、同時にJava,Python,C++を追加してみましょう

> db.employees.update({"emp_id":1001},{"$push":{"skills":"Java"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.employees.findOne()
{
        "_id" : ObjectId("575f1b9a5e4f17980e7b3367"),
        "emp_id" : 1001,
        "name" : "田中太郎",
        "profile" : {
                "dept" : "技術部",
                "code" : 10085,
                "ext" : "1234"
        },
        "skills" : [
                "JavaScript",
                "Java"
        ]
}
> 

$pushAll

> db.employees.update({"emp_id":1001},{"$pushAll":{"skills":["Java","Python","C++"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.employees.findOne()
{
        "_id" : ObjectId("575f1b9a5e4f17980e7b3367"),
        "emp_id" : 1001,
        "name" : "田中太郎",
        "profile" : {
                "dept" : "技術部",
                "code" : 10085,
                "ext" : "1234"
        },
        "skills" : [
                "JavaScript",
                "Java",
                "Java",
                "Python",
                "C++"
        ]
}
> 

3、$addToSet 重複しない要素を配列に追加

> db.employees.update({"emp_id":1001},{"$addToSet":{"skills":"Python"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
> 
#上記の結果から、1件一致し、0件挿入・変更されたことがわかります。要素が存在するかどうかを判断できることがわかります

要素を追加する

#存在しない場合は作成
> db.employees.update({"emp_id":1001},{"$addToSet":{"skills":"React"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> 

重複しない複数の要素を追加するには、$each演算子を使用する必要があります

#ここでReact,Pythonは存在し、Go,Rustは存在しない状態で、一括挿入の結果を見てみましょう
> db.employees.update({"emp_id":1001},{"$addToSet":{"skills":{"$each":["React","Go","Rust","Python"]}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

#結果
> db.employees.findOne()
{
        "_id" : ObjectId("575f1b9a5e4f17980e7b3367"),
        "emp_id" : 1001,
        "name" : "田中太郎",
        "profile" : {
                "dept" : "技術部",
                "code" : 10085,
                "ext" : "1234"
        },
        "skills" : [
                "JavaScript",
                "Java",
                "Java",
                "Python",
                "C++",
                "React",
                "Go",
                "Rust"
        ]
}
> 

まとめ:

db.employees.update({"emp_id":1001},{"$push":{"skills":"JavaScript"}}) #配列の末尾に要素を1つ追加

db.employees.update({"emp_id":1001},{"$pushAll":{"skills":["Java","Python","C++"]}}) #配列の末尾に複数の要素を追加し、重複をチェックしない

db.employees.update({"emp_id":1001},{"$addToSet":{"skills":"Python"}}) #重複しない要素を配列に追加

実際の運用では、重複しない複数の要素を挿入する必要がある場合、$addToSetと$each演算子を組み合わせて使用できます

db.employees.update({"emp_id":1001},{"$addToSet":{"skills":{"$each":["React","Go","Rust","Python"]}}})

二、配列要素の削除

1、$pop 配列から1つの値を削除、先頭または末尾からのみ

$popは配列の先頭または末尾から値を削除します

上記の結果から、$pop演算子の値が正の場合は配列の右側から値を削除し、負の場合は配列の左側から値を削除することがわかります

2、$pull 指定された配列の特定の要素を削除

3、$pullAll 指定された複数の配列要素を削除

まとめ:

db.employees.update({"emp_id":1001},{"$pop":{"skills":-1}}) #左側から1つの要素を削除

db.employees.update({"emp_id":1001},{"$pop":{"skills":1}})#右側から1つの要素を削除

db.employees.update({"emp_id":1001},{"$pull":{"skills":"Java"}}) #配列内の指定された要素を削除

db.employees.update({"emp_id":1001},{"$pullAll":{"skills":["Java","Python"]}}) #配列内の指定された複数の要素を削除

三、配列要素の更新

1、変数を使用してインデックスを呼び出して更新

> db.employees.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "emp_id" : 1001,
        "name" : "田中太郎",
        "profile" : {
                "dept" : "技術部",
                "code" : 10085,
                "ext" : "1234"
        },
        "skills" : [
                "JavaScript",
                "Java"
        ]
}
> a = db.employees.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "emp_id" : 1001,
        "name" : "田中太郎",
        "profile" : {
                "dept" : "技術部",
                "code" : 10085,
                "ext" : "1234"
        },
        "skills" : [
                "JavaScript",
                "Java"
        ]
}
> a.skills
[ "JavaScript", "Java" ]
> a.skills[0]
JavaScript
> a.skills[1]
Java
> a.skills[1] = "Python"
Python
> db.employees.update({"emp_id":1001},a)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.employees.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "emp_id" : 1001,
        "name" : "田中太郎",
        "profile" : {
                "dept" : "技術部",
                "code" : 10085,
                "ext" : "1234"
        },
        "skills" : [
                "JavaScript",
                "Python"
        ]
}
> 

2、配列.インデックスを使用して更新

> db.employees.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "emp_id" : 1001,
        "name" : "田中太郎",
        "profile" : {
                "dept" : "技術部",
                "code" : 10085,
                "ext" : "1234"
        },
        "skills" : [
                "JavaScript",
                "Python"
        ]
}
> db.employees.update({"emp_id":1001},{"$set":{"skills.0":"TypeScript"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.employees.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "emp_id" : 1001,
        "name" : "田中太郎",
        "profile" : {
                "dept" : "技術部",
                "code" : 10085,
                "ext" : "1234"
        },
        "skills" : [
                "TypeScript",
                "Python"
        ]
}
> 

上記のskills.0はskills[0]に相当し、インデックスを使用して呼び出すとMongoDBが認識します!

四、ネストされたドキュメントの更新

以下の例は、ドキュメント内のドキュメントは「.」で区切って一段階一段階にネストして変更できることを示しています

1、クエリ

> b = db.employees.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "emp_id" : 1001,
        "name" : "田中太郎",
        "profile" : {
                "dept" : "技術部",
                "code" : 10085,
                "ext" : "1234"
        },
        "skills" : [
                "TypeScript",
                "Python"
        ]
}
> b.pro
b.profile  b.project
> b.profile
{ "dept" : "技術部", "code" : 10085, "ext" : "1234" }
> b.profile.dept
技術部
> b.profile.dept 

2、更新

> b.profile.code = 99999
99999
> b
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "emp_id" : 1001,
        "name" : "田中太郎",
        "profile" : {
                "dept" : "技術部",
                "code" : 99999,
                "ext" : "1234"
        },
        "skills" : [
                "TypeScript",
                "Python"
        ]
}
> db.employees.update({"emp_id":1001},b)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.employees.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "emp_id" : 1001,
        "name" : "田中太郎",
        "profile" : {
                "dept" : "技術部",
                "code" : 99999,
                "ext" : "1234"
        },
        "skills" : [
                "TypeScript",
                "Python"
        ]
}
> 

タグ: MongoDB NoSQL データベース CRUD操作 ドキュメント指向

6月30日 21:07 投稿