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

MongoDBでローカライズされたデータをクエリする

    ジェネリッククエリを作成するには、これを支援する便利な演算子がいくつかあるため、集計フレームワークが必要になります。まず、埋め込まれたドキュメントをキーと値のペアの配列に変換してから、ロケールをパラメータとして渡すキーフィールドで配列をフィルタリングする必要があります。

    たとえば、ドキュメントを変換します

      "title": {
        "en": "title en2",
        "de": "title de2"
      },
    

    配列に

      "title": [
        { "k": "en", '"v": "title en2" },
        { "k": "de", "v": "title de2" }
      ],
    

    $objectToArrayを使用する オペレーター。次に、 $filter 演算子として

    {
        '$filter': {
            'input': { '$objectToArray': '$title' },
            'cond': { '$eq': ['$$this.k', locale] }
        }
    }
    

    ここで、変数localeは渡されたパラメーターから派生します。

    フィルター処理された配列を取得したら、値フィールドを取得するには、$arrayElemAt 演算子は値キーに次のように適用されます

    { 
        '$arrayElemAt': ['$title.v', 0]
    }
    

    したがって、最終的には、次のようなパイプラインを実行する必要があります。

    var locale = 'en';
    
    db.cs.aggregate([
        { '$match': { "cID" : "00001" } },
        { '$addFields': {
            'title': {
                '$filter': {
                    'input': { '$objectToArray': '$title' },
                    'cond': { '$eq': ['$$this.k', locale] }
                }
            },
            'desc': {
                '$filter': {
                    'input': { '$objectToArray': '$desc' },
                    'cond': { '$eq': ['$$this.k', locale] }
                }
            }
        } },
    
        { '$addFields': {
            'title': { 
                '$arrayElemAt': ['$title.v', 0]
            },
            'desc': { 
                '$arrayElemAt': ['$desc.v', 0]
            }
        } }
    ]);
    

    そして、いくつかのリファクタリングがあります:

    var locale = 'en';
    var getFilterOperatorExpression = function (field) {
        return {
            '$filter': {
                'input': { '$objectToArray': '$'+ field },
                'cond': { '$eq': ['$$this.k', locale] }
            }
        }
    };
    var getValueOperatorExpression = function (field) { 
        return { 
            '$arrayElemAt': ['$'+ field +'.v', 0]
        }
    };
    
    db.cs.aggregate([
        { '$match': { "cID" : "00001" } },
        { '$addFields': {
            'title': getFilterOperatorExpression('title'),
            'desc': getFilterOperatorExpression('desc'),
        } },
    
        { '$addFields': {
            'title': getValueOperatorExpression('title'),
            'desc': getValueOperatorExpression('desc')
        } }
    ]);
    


    1. MongoDB:サブドキュメントの更新

    2. MongoDB-ドキュメントを削除する

    3. 配列Mongoose/Mongodb内のネストされたサブドキュメントのdesc値に基づいてクエリ結果を並べ替えます

    4. トレーニングに失敗しました-AWS機械学習