あなたの質問は「n番目ごとのインスタンスを取得する」という明確な質問のようですが、これはかなり明確な質問のようです。
.find()
などのクエリ操作 プロジェクションの一般的なフィールド「selection」と$
一致演算子または$elemMatch
単一の一致した配列要素を許可します。
もちろん、 $slice
があります。
、ただし、これにより配列の「範囲選択」が可能になるため、ここでも適用されません。
サーバー上の結果を変更できる「唯一の」ものは、です。 .aggregate()
および.mapReduce()
。前者は、少なくとも「n」個の要素では、「スライス」配列では「うまく機能」しません。ただし、mapReduceの「function()」引数はJavaScriptベースのロジックであるため、少し余裕があります。
分析プロセスの場合、および分析目的の場合は「のみ」、 .filter()
:
db.collection.mapReduce(
function() {
var id = this._id;
delete this._id;
// filter the content of "instances" to every 3rd item only
this.instances = this.instances.filter(function(el,idx) {
return ((idx+1) % 3) == 0;
});
emit(id,this);
},
function() {},
{ "out": { "inline": 1 } } // or output to collection as required
)
現時点では、これは実際には単なる「JavaScriptランナー」ですが、これが分析/テストのみを目的としている場合は、概念に一般的な問題はありません。もちろん、出力はドキュメントが「正確に」どのように構成されているかではありませんが、mapReduceが取得できる限りファクシミリに近いものです。
ここに表示されるもう1つの提案では、すべてのアイテムを「非正規化」して新しいコレクションを作成し、配列から「インデックス」を一意の_id
の一部として挿入する必要があります。 鍵。それはあなたが直接問い合わせることができる何かを生み出すかもしれません、あなたがまだしなければならないであろう「すべてのn番目のアイテム」のために:
db.resultCollection.find({
"_id.index": { "$in": [2,5,8,11,14] } // and so on ....
})
したがって、「すべてのアイテム」を取得するために、「すべてのアイテム」のインデックス値を計算して提供します。ですから、それは実際に尋ねられた問題を解決するようには見えません。
出力フォームが「テスト」の目的でより望ましいと思われる場合は、 $redact
db.newCollection([
{ "$redact": {
"$cond": {
"if": {
"$eq": [
{ "$mod": [ { "$add": [ "$_id.index", 1] }, 3 ] },
0 ]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
これは、少なくとも.filter()
で適用されたものとほぼ同じ「論理条件」を使用します。 クエリ引数としてすべての可能なインデックス値をリストせずに、「n番目のインデックス」アイテムを選択する前に。