$slice (配列長の上限設定・更新)
最終更新:2026-10-09
$slice (配列長の上限設定・更新)
更新修飾子としての $slice は、$push 後に配列の長さを上限で切り詰めます。`{ $push: { log: { $each: [msg], $slice: -10 } } }` で最新 10 件だけを保持します。負の値は末尾から、正の値は先頭から切り詰めます。$each と組み合わせるとローリングログを実現できます — 射影の $slice と同じ名前ですが役割が異なります。
| カテゴリ | 更新修飾子 |
|---|---|
| MongoDB バージョン | 1.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ $push: { <array field>: { $each: [ <value> ], $slice: <count> } } }
⚙️ パラメータ
| 配列フィールド | 上限を設ける配列フィールド。 |
|---|---|
| 数 | 保持する件数。負の値は末尾から保持します。 |
戻り値:更新結果
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// $slice: 最新のログ 10 件を保持
// -10 は末尾から 10 件を保持
db.devices.updateOne(
{ _id: 1 },
{ $push: { log: { $each: ['boot ok'], $slice: -10 } } }
)
出力:
// 追加後に log は最新 10 件に切り詰められる
📌 注意事項
- $push 内で $each と一緒に使う必要がある
- 負の値は末尾から、正の値は先頭から保持する
- 射影の $slice と同じ名前だが役割が異なる
🏷️ 関連タグ
💡 関連ケース
さらなる実践ケースを近日公開予定。
📚 関連チュートリアル
❓ よくある質問
Q更新の $slice と射影の $slice は同じものですか?
Aいいえ。更新の $slice は配列を切り詰め、射影の $slice は結果の形を整えるだけです。
Q$slice: -10 はどういう意味ですか?
A末尾から 10 件を保持し、ローリングログを実現します。
Q$slice は $each と必ず組み合わせますか?
Aはい。MongoDB 5.0 以降、$slice は $each と一緒にしか使えません。