MongoDBの「$」オペレータの使い方について忘れがちな自分のためのメモです。
基本的に公式ドキュメントからそのままの引用ですのであしからず。。
$(Projection)
参照元:http://docs.mongodb.org/manual/reference/operator/projection/positional/#proj._S_
クエリの結果内の配列で最初に一致する要素だけを返します。
具体例を示します。
データ登録
var docs = [
{ "_id": 1, "semester": 1, "grades": [ 70, 87, 90 ] },
{ "_id": 2, "semester": 1, "grades": [ 90, 88, 92 ] },
{ "_id": 3, "semester": 1, "grades": [ 85, 100, 90 ] },
{ "_id": 4, "semester": 2, "grades": [ 79, 85, 80 ] },
{ "_id": 5, "semester": 2, "grades": [ 88, 88, 92 ] },
{ "_id": 6, "semester": 2, "grades": [ 95, 90, 96 ] }
];
docs.forEach(function(d) {
db.sample_find.insert(d);
});
検索例1
db.sample_find.find(
{ "semester": 1, "grades": { "$gte": 85 } }, //semesterが1、かつgradesが85以上の要素を含むドキュメントを検索する
{ "grades.$": 1 } //検索結果のgrades配列で最初に一致する要素だけ返す
);
//結果
{ "_id": 1, "grades": [ 87 ] }
{ "_id": 2, "grades": [ 90 ] }
{ "_id": 3, "grades": [ 85 ] }
検索例2
db.sample_find.find( { "semester": 1, "grades": { "$gte": 95 } }, { "grades.$": 1 } )
//結果
{ "_id": 3, "grades": [ 100 ] }
$(Update)
参照元:http://docs.mongodb.org/manual/reference/operator/update/positional/
配列のインデックスを明示的に指定することなく、更新対象の配列の要素を特定することができます。
具体例を示します。
データ登録
var docs = [
{
"_id": 4,
"grades": [
{ "grade": 80, "mean": 75, "std": 8 },
{ "grade": 85, "mean": 90, "std": 5 },
{ "grade": 90, "mean": 85, "std": 3 }
]
}
];
docs.forEach(function(d) {
db.sample_update.insert(d);
});
更新例1
db.sample_update.update(
{ "_id": 4, "grades.grade": 85 },
{ "$set": { "grades.$.std": 6 } } //条件に一致する配列要素のstdを6に更新する
);
//検索
db.sample_update.find( { "_id": 4 } );
//結果
{
"_id": 4,
"grades": [
{ "grade": 80, "mean": 75, "std": 8 },
{ "grade": 85, "mean": 90, "std": 6 }, //stdが6に更新された
{ "grade": 90, "mean": 85, "std": 3 }
]
}
更新例2
db.sample_update.update(
{ "_id": 4, "grades.grade": { "$gte": 85 } },
{ "$set": { "grades.$.std": 10 } } //条件に一致する配列要素のstdを10に更新する
);
//検索
db.sample_update.find( { "_id": 4 } );
//結果
{
"_id" : 4,
"grades" : [
{ "grade": 80, "mean": 75, "std": 8 },
{ "grade": 85, "mean": 90, "std": 10 }, //stdが10に更新された
{ "grade": 90, "mean": 85, "std": 3 } //こちらのstdは更新されないみたい。。
]
}
更新例2では、gradeが90のstdは更新されませんでした。
$(Projection)と同様、条件に一致する配列内の最初の要素だけが更新対象となるようです。