MongoDBでは、$slice
集計パイプライン演算子は、配列のサブセットを返します。
$slice
を使用するには 、配列から返す要素の数を指定します。配列からサブセットを取得する開始位置を指定することもできます。
例
test
というコレクションがあるとします。 次のドキュメントで:
{ "_id" : 1, "data" : [ "Aardvark", "Buffalo", "Cat", "Dog", "Horse", "Gorilla", "Zebra" ] }
$slice
を使用できます data
の配列からサブセットを取得します フィールド。
正の整数
正の値を1つ指定すると、配列の先頭からの開始位置が決まります。
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 3 ] }
}
}
]
)
結果:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
この場合、正の数の3
を提供しました 、したがって、配列から返された最初の3つの要素。
負の整数
負の値を1つ指定すると、終了からの開始位置が決まります。 アレイの。
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -3 ] }
}
}
]
)
結果:
{ "result" : [ "Horse", "Gorilla", "Zebra" ] }
この場合、配列から最後の3つの要素を返しました。
開始位置も指定する場合、負の整数を指定できないことに注意してください。これについては後で詳しく説明します。
開始位置を指定
開始位置を指定するオプションもあります。これを行うには、他の整数の前に別の整数を指定します。
正の整数
開始位置に正の整数を使用する例を次に示します。
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 2, 3 ] }
}
}
]
)
結果:
{ "result" : [ "Cat", "Dog", "Horse" ] }
この場合、2
の開始位置を指定しました スライスサイズは3
。
配列はゼロベースであるため、2
の正の整数であることに注意してください。 その結果、3番目の位置からスライス操作が開始されました。
負の整数
開始位置に負の整数を使用する例を次に示します。
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -4, 3 ] }
}
}
]
)
結果:
{ "result" : [ "Dog", "Horse", "Gorilla" ] }
この場合、-4
を指定しました 、その結果、スライス操作は最後から4つの場所をカウントバックしました。
特大スライス
配列で使用可能な要素よりも大きいスライスサイズを指定すると、残りの配列要素のみが返されます。
例:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -1, 3 ] }
}
}
]
)
結果:
{ "result" : [ "Zebra" ] }
ここでは、配列の最後から1つの位置だけを開始した場合でも、3つの要素を返すように指定しました。この場合、1つの要素(配列の最後の要素)のみが返されました。
範囲外の開始位置
配列の範囲外の開始位置を指定すると、一部の要素または空の配列が返される場合があります。それはすべて、提供されている値によって異なります。
空の配列を返す例を次に示します。
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 10, 3 ] }
}
}
]
)
結果:
{ "result" : [ ] }
開始位置が10
だったため、これは空の配列を返しました 、7
しかないのに 配列内の要素(およびカウントは0
から取得されます 6
へ 。
ただし、配列サイズよりも大きい負の値を指定した場合、スライスは配列の先頭から始まります。
例:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -10, 3 ] }
}
}
]
)
結果:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
開始位置のあるネガティブスライス
前述のように、開始位置も指定する場合、負の整数を指定することはできません。これを行うとエラーが発生します。
例:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 4, -3 ] }
}
}
]
)
結果:
Error: command failed: { "ok" : 0, "errmsg" : "Third argument to $slice must be positive: -3", "code" : 28729, "codeName" : "Location28729" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1