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

Mongo-オブジェクトキーが可変である場所に一致

    MongoDB 3.4.4では、集約フレームワークを使用してドキュメントをクエリします。これは、 $objectToArrayで可能になります。 処理されたフィールドのキーをキー/値ペアの配列にマップできるようにする演算子。リストは簡単にフィルタリングして、どのような条件にも一致するキーを取得できます。

    次の例では、集計パイプラインは、上記のfalse値を持つ条件に一致するキーを保持する追加のフィールドで構成されているため、理想的には配列になります。

    db.collection.aggregate([
        { "$addFields": {
            "notProcessed": { 
                "$map" : {
                    "input": {
                        "$filter": {
                            "input": { "$objectToArray": "$processed" },
                            "as": "el",
                            "cond": { "$not": "$$el.v" }
                        }
                    },
                    "in": "$$this.k"
                }
            }
        } }
    ])
    

    これにより

    {
        "_id" : ObjectId("5501b1648ef0b4eccc41814e"),
        "link" : "xxxxx.jpg",
        "processed" : {
            "320" : true,
            "480" : true,
            "540" : true,
            "720" : true,
            "800" : true,
            "1080" : true,
            "original" : false,
            "iPhone" : true
        },
        "notProcessed" : [ 
            "original"
        ]
    }
    

    説明

    ネストされた式から開始

    {
        "$filter": {
            "input": { "$objectToArray": "$processed" },
            "as": "el",
            "cond": { "$not": "$$el.v" }
        }
    }
    

    $filterへの入力 演算子 { "$objectToArray": "$processed" } processedのキーを変換します この配列の鍵:

    [ 
        {
            "k" : "320",
            "v" : true
        }, 
        {
            "k" : "480",
            "v" : true
        }, 
        {
            "k" : "540",
            "v" : true
        }, 
        {
            "k" : "720",
            "v" : true
        }, 
        {
            "k" : "800",
            "v" : true
        }, 
        {
            "k" : "1080",
            "v" : true
        }, 
        {
            "k" : "original",
            "v" : false
        }, 
        {
            "k" : "iPhone",
            "v" : true
        }
    ]
    

    および $filter 上記の配列をフィルタリングして、vのオブジェクト要素のみを含める プロパティはNOT true

    [ 
        {
            "k" : "original",
            "v" : false
        }
    ]
    

    $map 次に、値のみを含むマップされた配列を返します

    [ { "k" : "original", "v" : false } ] => [ "original" ]
    

    だからあなたはただ

    で終わる
    [ "original" ]
    

    結果として。

    古いバージョンのMongoDBでは、動的キーに対してクエリを発行するのはかなり困難になります。クエリが簡単なこのドキュメントモデルに従うようにスキーマを変更することを検討してください:

    // this operation changes the schema
    var processed = [];
    db.collection.find().forEach( function(doc) {
         for(key in doc.processed) {
            if(doc.processed.hasOwnProperty(key)) {
                var item = { key: key, value: doc.processed[key] }
                processed.push(item);            
            }
         }
         doc.processed = processed;
         db.collection.save(doc);
    });
    
    // modified schema    
    
    { 
        "link": "xxxxx.jpg"
        "_id": ObjectId("5501b1648ef0b4eccc41814e"),
        "processed": [
             { "key": "320", "value": true },
             { "key": "480", "value": true },
             { "key": "540", "value": true },
             { "key": "720", "value": true },
             { "key": "800", "value": true },
             { "key": "1080", "value": true },
             { "key": "original", "value": false },
             { "key": "iPhone", "value": true }
        ]
    }
    

    検索クエリは単純になります

    db.collection.find({"processed.value": false});
    

    または、 $mapを使用します および $filter falseでキーを返す としての値

    db.collection.aggregate([
        { "$project": {
            "link": 1,
            "notProcessed": { 
                "$map" : {
                    "input": {
                        "$filter": {
                            "input": "$processed",
                            "as": "el",
                            "cond": { "$not": "$$el.v" }
                        }
                    },
                    "in": "$$this.k"
                }
            }
        } }
    ])
    


    1. ドキュメントのサブ配列にmongodbjavaを使用したMongoDB削除クエリの何が問題になっていますか?

    2. マングース-ユニーク-バリデーターを動作させることができません

    3. docker-mongodbでdjangoを実行するように作成します

    4. Pymongo-ValueError:insert_manyを使用する場合、NaTTypeはutcoffsetをサポートしません