Docs Menu
Docs Home
/
データベース マニュアル
/ / /

ドル記号のプレフィックスがついたフィールド名

このセクションでは、さまざまな挿入操作と更新操作でドル記号( $)のプレフィックスがついたフィールド名がどのように処理されるかについてまとめます。MongoDB は、一部の機能がこれらのフィールドではサポートされていないため、ドル記号のプレフィックスが付いたフィールド名の使用を推奨しません。 詳細については、一般的な制限 を参照してください。

ドル記号($)のプレフィックスがついたフィールドは、挿入のトップレベルおよびネストされたフィールド名として使用できます。

db.sales.insertOne( {
"$price": 50.00,
"quantity": 30
} )

ドル記号($)のプレフィックスがついたフィールドは、それ以外を予約語として使用する挿入で使用できます。$inc のような演算子名や、iddbref のような単語もフィールド名として使用できます。

db.books.insertOne( {
"$id": "h1961-01",
"location": {
"$db": "novels",
"$ref": "2007042768",
"$inc": true
} } )

アップサート中に新しいドキュメントを作成する更新は、フィールド名の検証の update ではなく insert として扱われます。アップサートは、ドル記号($)のプレフィックスがついたフィールドを受け入れることができます。ただし、アップサートは、特殊なケースであるため、更新の match の部分で既存のドキュメントが選択された場合、同様の更新操作でエラーが発生する可能性があります。

このコード サンプルは upsert: true に設定されているため、クエリ用語の { "date": "2021-07-07" } に一致するドキュメントがコレクションにまだ含まれていない場合は、新しいドキュメントが挿入されます。このサンプル コードが既存のドキュメントと一致する場合、$hotel にドル記号($)のプレフィックスが付いているため更新は失敗します。

db.expenses.updateOne(
{ "date": "2021-07-07" },
{ $set: {
"phone": 25.17,
"$hotel": 320.10
} },
{ upsert: true }
)

更新演算子は、既存のフィールドを新しいドキュメントに置き換えるか、それらのフィールドを変更します。更新によって置換が実行される場合、ドル記号($)のプレフィックスがついたフィールドは最上位のフィールド名として使用できません。

次のようなドキュメントについて考えてみましょう。

{
"_id": "E123",
"address": {
"$number": 123,
"$street": "Elm Road"
},
"$rooms": {
"br": 2,
"bath": 1
}
}

既存のドキュメントを置き換える更新演算子を使用して address.$street フィールドを変更することはできますが、その方法で $rooms フィールドを更新することはできません。

db.housing.updateOne(
{ "_id": "E123" },
{ $set: { "address.$street": "Elm Ave" } }
)

集計パイプラインの一部として$setFieldを使用して、 最上位のドル記号( $ )のプレフィックス付きフィールドを$roomsのように更新します。

更新によって既存のドキュメント フィールドが、置き換えではなく変更される場合、ドル記号($)のプレフィックスがついたフィールドが最上位のフィールド名になることがあります。サブフィールドには直接アクセスできますが、最上位のフィールドにアクセスするにはヘルパー メソッドが必要です。

Tip

このレコードのようなドキュメントがあるコレクションを考えてみましょう。

{
_id: ObjectId("610023ad7d58ecda39b8d161"),
"part": "AB305",
"$bin": 200,
"quantity": 100,
"pricing": { sale: true, "$discount": 60 }
}

pricing.$discount サブフィールドは、直接クエリできます。

db.inventory.findAndModify( {
query: { "part": { $eq: "AB305" } },
update: { $inc: { "pricing.$discount": 10 } }
} )

最上位レベルの $bin フィールドの値にアクセスするには、$getField$literal を使用します。

db.inventory.findAndModify( {
query: { $expr: {
$eq: [ { $getField: { $literal: "$bin" } }, 200 ]
} },
update: { $inc: { "quantity": 10 } }
} )

集計パイプラインのドル記号($)のプレフィックスがついたフィールドを変更するには、$replaceWith ステージで $setField$getField、および $literal 使用します。

次のような学校のレコードのコレクションを考えてみましょう。

db.school.insertOne (
{
"_id": 100001,
"$term": "fall",
"registered": true,
"grade": 4
} )

パイプラインを使用して、ドル記号($)のプレフィックスが付いた $term フィールドを更新し、春学期の新しいコレクションを作成します。

db.school.aggregate( [
{ $match: { "registered": true } },
{ $replaceWith: {
$setField: {
field: { $literal: "$term" },
input: "$$ROOT",
value: "spring"
} } },
{ $out: "spring2022" }
] )

戻る

ピリオドとドル記号

項目一覧