Docs Menu
Docs Home
/
MongoDBマニュアル
/ / / /

$slice(プロジェクション)

項目一覧

  • 定義
  • 構文
  • 動作
$slice

$sliceプロジェクション演算子は、クエリ結果で返される配列内の要素の数を指定します。

注意

曖昧さ回避

$pushを使用した更新中に配列のサイズを制限する方法については、代わりに$slice修飾子を参照してください。

集計演算子については、この項目ではなく $slice 集計演算子を参照してください。

$sliceには次のいずれかの構文形式があります。

db.collection.find(
<query>,
{ <arrayField>: { $slice: <number> } }
);

or

db.collection.find(
<query>,
{ <arrayField>: { $slice: [ <number>, <number> ] } }
);
説明

$slice: <number>

<arrayField> で返す要素の数を指定します。<number> の場合:

  • 正の数 n を指定すると、最初の n 個の要素を返します。

  • 負の数 n を指定すると、最後の n 個の要素を返します。

<number> が配列要素の数より大きい場合、クエリはすべての配列要素を返します。

$slice: [ <number to skip>, <number to return> ]

最初の要素から指定された数の要素をスキップした後、<arrayField> で返す要素の数を指定します。両方の要素を指定する必要があります。

<number to skip> の場合:

  • 配列の先頭、つまり 0 番目のインデックス位置から n 要素をスキップするには、正の数 n を指定します。0 から始まる配列インデックスに基づいて、たとえば 1 は 2 番目の要素の開始位置を示します。n が配列要素の数より大きい場合、クエリは <arrayField> に対して空の配列を返します。

  • インデックス位置から逆向きに n の要素をスキップするには、負の数値 n を指定します。つまり、0 から始まる配列インデックス(最初の要素はインデックス 0)に基づくと、-1 は最後の要素の開始位置などを示します。負の数の絶対値が配列要素の数より大きい場合、開始位置は配列の先頭になります。

<number to return> について、指定された数をスキップした後から次のn 要素を返すには、正のn を指定する必要があります。

ネストされたドキュメント内の配列の $slice プロジェクションは、プロジェクションがインクルージョン プロジェクションの一部である場合、ネストされたドキュメント内の他のフィールドを返さなくなりました。

たとえば、size フィールドを含むドキュメントを含むコレクション inventory を考えます。

{ item: "socks", qty: 100, details: { colors: [ "blue", "red" ], sizes: [ "S", "M", "L"] } }

次の操作では、 _idフィールド(デフォルト)、 qtyフィールド、およびdetailsフィールドを、 colors配列の指定されたスライスのみでプロジェクションします。

db.inventory.find( { }, { qty: 1, "details.colors": { $slice: 1 } } )

つまり、この操作は次のドキュメントを返します。

{ "_id" : ObjectId("5ee92a6ec644acb6d13eedb1"), "qty" : 100, "details" : { "colors" : [ "blue" ] } }

$sliceプロジェクションが除外プロジェクションの一部である場合、操作はネストされたドキュメント内の他のフィールドを引き続き返します。 つまり、次のプロジェクションは除外プロジェクションです。 プロジェクションでは、 _idフィールドと指定されたスライスの範囲外のcolors配列内の要素は除外され、他のすべてのフィールドが返されます。

db.inventory.find( { }, { _id: 0, "details.colors": { $slice: 1 } } )
{ "item" : "socks", "qty" : 100, "details" : { "colors" : [ "blue" ], "sizes" : [ "S", "M", "L" ] } }

$sliceプロジェクション自体は除外されていると見なされます。

以前のバージョンでは、プロジェクションが包含か除外かに関係なく、 $sliceプロジェクションにはネストされたドキュメント内の他のフィールドも含まれていました。

ビューにおける db.collection.find() 操作は $slice プロジェクション演算子をサポートしていません。

findfindAndModify のプロジェクションでは、$ プロジェクション式の一部として $slice プロジェクション式を含めることはできません。

たとえば、次の操作は無効です。

db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } )

以前のバージョンでは、MongoDB はクエリ条件に一致する instock 配列の最初の要素(instock.$)を返します。つまり、位置プロジェクション"instock.$" が優先され、$slice:1 の処理はありません。"instock.$": { $slice: 1 } は他のドキュメント フィールドを除外しません。

findおよびfindAndModifyプロジェクションには、配列の$sliceと配列に埋め込まれたフィールドの両方を含めることはできません。

たとえば、配列フィールド instock を含むコレクション inventory を考えます。

{ ..., instock: [ { warehouse: "A", qty: 35 }, { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ], ... }

次の操作はPath collisionエラーで失敗します。

db.inventory.find( {}, { "instock": { $slice: 1 }, "instock.warehouse": 0 } )

以前のバージョンでは、プロジェクションは両方のプロジェクションを適用し、instock 配列の最初の要素($slice: 1)を返しますが、プロジェクションされた要素の warehouse フィールドは非表示にされていました。MongoDB 4.4 以降で同じ結果を得るには、2 つの個別の $project ステージで db.collection.aggregate() メソッドを使用します。

Tip

以下も参照してください。

次のドキュメントを使用して posts サンプル コレクションを作成します。

db.posts.insertMany([
{
_id: 1,
title: "Bagels are not croissants.",
comments: [ { comment: "0. true" }, { comment: "1. croissants aren't bagels."} ]
},
{
_id: 2,
title: "Coffee please.",
comments: [ { comment: "0. fooey" }, { comment: "1. tea please" }, { comment: "2. iced coffee" }, { comment: "3. cappuccino" }, { comment: "4. whatever" } ]
}
])

次の操作では、comments 配列に対して $slice プロジェクション演算子を使用して、最初の 3 つの要素を含む配列を返します。配列の要素が 3 つ未満の場合、配列内のすべての要素が返されます。

db.posts.find( {}, { comments: { $slice: 3 } } )

この操作により、次のドキュメントが返されます。

{
"_id" : 1,
"title" : "Bagels are not croissants.",
"comments" : [ { "comment" : "0. true" }, { "comment" : "1. croissants aren't bagels." } ]
}
{
"_id" : 2,
"title" : "Coffee please.",
"comments" : [ { "comment" : "0. fooey" }, { "comment" : "1. tea please" }, { "comment" : "2. iced coffee" } ]
}

次の操作では、 comments配列に対して$sliceプロジェクション演算子を使用して、最後の 3 つの要素を含む配列を返します。 配列の要素が 3 つ未満の場合、配列内のすべての要素が返されます。

db.posts.find( {}, { comments: { $slice: -3 } } )

この操作により、次のドキュメントが返されます。

{
"_id" : 1,
"title" : "Bagels are not croissants.",
"comments" : [ { "comment" : "0. true" }, { "comment" : "1. croissants aren't bagels." } ]
}
{
"_id" : 2,
"title" : "Coffee please.",
"comments" : [ { "comment" : "2. iced coffee" }, { "comment" : "3. cappuccino" }, { "comment" : "4. whatever" } ]
}

次の操作では、 comments配列に対して$sliceプロジェクション演算子を使用して次のようにします。

  • 最初の要素をスキップして、2 番目の要素を開始点にします。

  • 次に、開始ポイントから 3 つの要素を返します。

スキップ後の配列の要素が 3 つ未満の場合、残りのすべての要素が返されます。

db.posts.find( {}, { comments: { $slice: [ 1, 3 ] } } )

この操作により、次のドキュメントが返されます。

{
"_id" : 1,
"title" : "Bagels are not croissants.",
"comments" : [ { "comment" : "1. croissants aren't bagels." } ]
}
{
"_id" : 2,
"title" : "Coffee please.",
"comments" : [ { "comment" : "1. tea please" }, { "comment" : "2. iced coffee" }, { "comment" : "3. cappuccino" } ]
}

次の操作では、comments 配列に対して $slice プロジェクション演算子を使用して、

  • 最後の要素を開始ポイントとして、最後の要素から逆方向にスキップします。

  • 次に、開始ポイントから 3 つの要素を返します。

スキップ後の配列の要素が 3 つ未満の場合、配列内の残りのすべての要素が返されます。

db.posts.find( {}, { comments: { $slice: [ -1, 3 ] } } )

この操作により、次のドキュメントが返されます。

{
"_id" : 1,
"title" : "Bagels are not croissants.",
"comments" : [ { "comment" : "1. croissants aren't bagels." } ]
}
{
"_id" : 2,
"title" : "Coffee please.",
"comments" : [ { "comment" : "4. whatever" } ]
}

戻る

$elemMatch