$slice
を実現するには、集計パイプラインを使用する必要があります 検索クエリの一部であるプロジェクトステートメントの制限により、チェーン。
以下のクエリは、最初の$slice
のため、無効です。 インデックスの代わりに配列を返し、外部スコープの$slice
を実行します。 失敗します。
db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})
さらに、同じプロジェクトステートメントで投影されたフィールドを操作する方法はありません。可能であれば、$sliceを適用してテキストをさらに変更することもできます。
行く方法は次のようになります:
Match
名前がfooのレコード。Unwind
最初のレベルに到達するためのテキスト配列。Unwind
再び私たちが望むレベルに到達するために。Group
レコードを名前でまとめます。Project
グループ内の最後のレコードであり、最後にネストされた配列の最後の要素でもあります。
コード:
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])
または、特定の順序で表示される要素を投影する場合は、$skip
を使用できます。 および$limit
これを達成するための操作。
var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])
ネストされた配列で2番目の要素を順番に投影します。