注: コードの実行には mongodb シェルを使用してください。
以下のような生徒用ドキュメントが 1 つあるとします。
{
"_id" : 4,
"grades" : [
{
"grade" : 80,
"mean" : 75,
"std" : 8
},
{
"grade" : 85,
"mean" : 90,
"std" : 5
},
{
"grade" : 85,
"mean" : 90,
"std" : 5
},
{
"grade" : 85,
"mean" : 95,
"std" : 6
},
{
"grade" : 90,
"mean" : 85,
"std" : 5
}
]
}
2 つの問題があります。
問題 1 : すべてのサブドキュメントを _id=4 && grades.grade = 85 && grades.std = 5 で更新したい場合、std=6 の場合、次のように記述します。
db.students.update( {'$and':[ { _id: 4},{ "grades.grade": 85 }, {"grades.std": 5 } ]}, { $set: { "grades.$.std" : 6 } } );
上記のステートメントを複数回 (3 回) 実行すると、理想的には 2 番目、3 番目のサブドキュメントを更新する必要があります。
しかし、std=5 の一致があるため、最後のサブドキュメントも更新されますが、条件を$ orではなく$ として指定した場合、最後のドキュメントが更新されるのはなぜですか?
問題 2 : ここで、クエリ条件に一致するサブドキュメント自体を削除したいとします。次のステートメントを試しました
db.students.update({_id:4,'grades.grade':85},{'$unset':{'grades.$':1}})
$unset はサブドキュメント/配列の場合に null を入れるため、この問題を解決するにはどうすればよいですか?
mongodb コンソールで複製する方法は?
db.students.insert( { "_id" : 4, "grades" : [ { grade: 80, mean: 75, std: 8 }, { grade: 85, mean: 90, std: 5 }, { grade: 85, mean: 90, std: 5 }, { grade: 85, mean: 95, std: 6 }, { grade: 90, mean: 85, std: 5 } ] });