2017-01-25 3 views
1

のネストされた配列をMongoDBの測定、私はこの種の文書がありますフィルタリングやオブジェクト

{ 
_id: "123", 
arrayName: [ 
     { text: 'first', field: false}, 
     { text: 'second', field: true}, 
     { text: 'third', field: false} 
      ] 
} 

は今、私はfield === falseオブジェクトのみを持っているために濾過arrayNameの長さを返すために、私のクエリにしたいと思います。

私はdb.collection.find({})で多くのクエリを試してみましたが、私はいつも、文書全体を受信して​​、最終的には、それは1

に()=>どんな提案を数えますか? ありがとう

+1

結果は期待していますか? 2つのオブジェクトを持つ配列ですか?集約を使用してこれを達成できますが、クエリだけでは達成できない場合があります。 – MasterAM

+0

Bestは、 'field === false'のオブジェクトだけを持つ新しい配列になります。 arrayNameにあるすべてのオブジェクトの量を 'field === false'(この場合は2)にするための他のオプションです。 – cowCrazy

+0

[$ filter](https://docs.mongodb.com/v3.2)を試してください/参照/演算子/集約/フィルター/)と[$サイズ](https://docs.mongodb.com/manual/reference/operator/aggregation/size/) – Veeram

答えて

1

あなたは望むものを達成するために投影演算子を使うことができます。

これを試してみてください:

db.collection.find({ 
    _id : givenId , 
    "arrayName.field" : false 
},{ 
    "arrayName.$":1 
},function(err,result){ 
    if(!err){ 
     len = result.arrayName.length; 
     //use len however you want. 
    } 
}); 

"arrayName.$":1は、配列の唯一のマッチした要素を選択します。次に、配列の長さを得ることができますfield:false

これは役に立ちます。

0

もう1人のユーザーが、単純なMongoクエリを使用して、あなたの質問に対して正しい答えを与えています。このコマンドで

Collection.find({ 
    // ... 
}, { 
    transform(doc) { 
    doc.filterArrayLength = doc.arrayName.filter(obj => obj.field === false).length; 

    return doc; 
    } 
}).fetch(); 

結果は次のようになります。しかし、私はあなたがそうここで私はあなたにfindコマンドでtransform機能を使って、あなたの問題を解決する別の方法を提示し、流星とモンゴを使用しているので、それはあまりを持っていないだろうと思いlike:

[ 
    // ... 
    { 
    _id: "123", 
    arrayName: [ 
     { 
     text: 'first', 
     field: false 
     }, { 
     text: 'second', 
     field: true 
     }, { 
     text: 'third', 
     field: false 
     } 
    ], 
    filterArrayLength: 2 
    } 
] 
+0

@RaviShankar私は私が何か間違った原因をしていると思う返す結果を 'console.log()'しようとしています。フィールド全体が 'false'に等しいだけでなく、' true'でもあるコレクションからドキュメント全体を取得しています。 – cowCrazy

関連する問題