sql >> データベース >  >> NoSQL >> MongoDB

サブフィールドのMongoDBリストプロジェクション

    コマンドを見つけました!! find()ではありません :-)

    db.lang_meta.distinct("resources.schema.fields.name")

    db.collection.distinct

    (編集)

    Ops、「厳密に正しい」答えはリスト (繰り返し反復が可能な場合)セットではありません (繰り返しが発生しない場合)。 db.lang_meta.distinct("resources.mediatype")のケースを参照してください 、正しいソリューションでは、1つだけでなく、4つの繰り返しアイテムのリストを返す必要があります。

    リストの場合 map()を使用できます ...ええと、1つのアイテムだけを想定すると、それは...

    db.lang_meta.find().map(function(c) { 
      return c.resources[0].schema.fields[0].name; 
    });
    

    ただし、.resourcesを反復処理する必要があります 以上.fields 、そう

    db.lang_meta.find().map(function(c) {
        var ret = [];
        for (var i=0; i<c.resources.length; i++) 
            for (var j=0; j<c.resources[i].schema.fields.length; j++) 
                 ret.push( c.resources[i].schema.fields[j].name );
       return ret;
    });
    

    ...これは近いですが、理想的な(エレガントな)ソリューションではありません。

    resources.mediatypeに戻る たとえば、これは「繰り返しの繰り返し」のより良い例です。

    db.lang_meta.find().map(function(c) {
        var ret = [];
        for (var i=0; i<c.resources.length; i++) 
                 ret.push( c.resources[i].mediatype );
       return ret;
    });
    

    これにより、"text/csv", "text/csv", "text/csv", "text/csv"が生成されます (!)しかし、配列の配列構造では...単純な配列ではありません。

    解決策?

    db.lang_meta.find({},{"resources.schema.fields.name":1})で何かをしましょう ...




    1. mongodbの配列オブジェクト値から合計する必要があります

    2. mongoose.jsクエリを同期的に実行する

    3. MongoDBでインデックスサイズを推定するためのツールはありますか?

    4. Mongomapperのドキュメント?