$slice(プロジェクション)
定義
$slice
$slice
プロジェクション演算子は、クエリ結果で返される配列内の要素の数を指定します。
構文
$slice
には次のいずれかの構文形式があります。
db.collection.find( <query>, { <arrayField>: { $slice: <number> } } );
or
db.collection.find( <query>, { <arrayField>: { $slice: [ <number>, <number> ] } } );
値 | 説明 |
---|---|
$slice: <number> |
|
$slice: [ <number to skip>, <number to return> ] | 最初の要素から指定された数の要素をスキップした後、
|
動作
$slice
の埋め込み配列
ネストされたドキュメント内の配列の $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
プロジェクション演算子をサポートしていません。
$
位置演算子と$slice
の制限
find
と findAndModify
のプロジェクションでは、$
プロジェクション式の一部として $slice
プロジェクション式を含めることはできません。
たとえば、次の操作は無効です。
db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } )
以前のバージョンでは、MongoDB はクエリ条件に一致する instock
配列の最初の要素(instock.$
)を返します。つまり、位置プロジェクション"instock.$"
が優先され、$slice:1
の処理はありません。"instock.$": {
$slice: 1 }
は他のドキュメント フィールドを除外しません。
パスの不一致: 配列の と埋め込みフィールド$slice
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()
メソッドを使用します。
例
次のドキュメントを使用して 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" } ] } ])
最初の 3 つの要素を含む配列を返します
次の操作では、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" } ] }
最後の 3 つの要素を含む配列を返します
次の操作では、 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" } ] }
最初の要素をスキップした後に 3 つの要素を含む配列を返す
次の操作では、 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" } ] }
最後の要素をスキップした後に 3 つの要素を持つ配列を返す
次の操作では、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" } ] }