1

こんにちは、配列数が2より小さいすべてのコレクションをmongodbのfeatures配列内に戻したいとします。私は$sizeを使ってみましたが、それはできません。配列要素内のカウント・キー

結果を取得し、それぞれfeaturesをループしてカウントしたくないです。私はproductId 123を返します。なぜなら、フィーチャーアレイの1つに1のカウントがあるからです。以下の文書を例として取ってください:

{ 
    "productId" : 123.0, 
    "features" : [ 
     { 
      "a" : true 
     }, 
     { 
      "a" : true, 
      "b" : true 
     } 
    ] 
}, 
{ 
    "productId" : 456.0, 
    "features" : [ 
     { 
      "a" : true, 
      "b" : true 
     }, 
     { 
      "a" : true, 
      "b" : true 
     } 
    ] 
} 

答えて

3

あなたが実際に求めているのは、配列要素内の「キーの数のカウント」です。利用可能なMongoDBのバージョンに応じて、これに対するアプローチは異なります。

MongoDBの3.4.4及び上方

あなたは、要素の「キー/値」のペアを表し、「アレイ」自体に各要素を強制する$objectToArrayを使用することができます。

db.collection.aggregate([ 
    { "$redact": { 
    "$cond": { 
     "if": { 
     "$anyElementTrue": { 
      "$map": { 
      "input": "$features", 
      "as": "f", 
      "in": { 
       "$lt": [ 
       { "$size": { "$objectToArray": "$$f" } }, 
       2 
       ] 
      } 
      } 
     } 
     }, 
     "then": "$$KEEP", 
     "else": "$$PRUNE" 
    } 
    }} 
]) 

あなたは基本的に$redactの条件を与えます。これは、$objectToArrayが各要素に適用され、$sizeのためにテストされた$mapの結果に対して、テストされた配列要素のいずれかが01を返すから$anyElementTrueまで。

他のすべてのバージョンどこでも他の

、もう少し簡単に探していますが、実際にはない効果的なパフォーマンスとしては、配列要素をテストするために、JavaScript式を適用する$whereを使用しています。 Object.keys()Array.some()を使っしかし同じ原理:

db.collection.find({ 
    "$where": function() { 
    return this.features.some(f => Object.keys(f).length < 2) 
    } 
}) 

同じ取引が、JavaScriptがすべての文書に対する解釈や評価を必要とするので、それは実際に集計式が与えられたことをかなり遅く実行されます。

の両方が尋ねたのと同様に、内側のオブジェクト内の「2つの未満の鍵」を持つ要素を有するものである同じ文書を返す:

/* 1 */ 
{ 
    "productId" : 123.0, 
    "features" : [ 
     { 
      "a" : true 
     }, 
     { 
      "a" : true, 
      "b" : true 
     } 
    ] 
} 
+0

答えてくれてありがとうしかし、私はできませんMongodDbの私のバージョンが2.6.12であるので動作させてください。 JavaScriptを試しましたが、シンボル '> 'に関連するエラーがあります。 – KristCont

+1

@KristCont"シェル "が本当に古く、ES6の構文を理解していない場合。以前の "server"リリースのより現代的なシェルを使用することには何も問題ありません。しかし、あなたは '$ where'引数を' return this.features.some(function(f){return Object.keys(f).length <2}) 'に変更することもできます。 –

+0

これ以上のあなたのコメントで'ys(f).length <2}'の近くでオブジェクト以外のオブジェクトで呼び出されたエラーObject.keysを返します。 – KristCont

関連する問題