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

2つの値に基づいて要素を検索します

    以前にリンクされたデュープから(可能性あり) $ whereを使用したソリューション 続く:

    db.collection.find({
        "$where": function() {
            self = this;
            return this.actors.filter(function(actor) {
                return self.director._id === actor._id;
            }).length > 0
        }
    })
    

    そして、集約フレームワークを使用する他の提案されたアプローチ $ redact パイプライン:

    db.collection.aggregate([
        { 
            "$redact": { 
                "$cond": [
                    { 
                        "$setIsSubset": [ 
                            ["$director._id"], 
                            {
                                "$map": {
                                    "input": "$actors",
                                    "as": "el",
                                    "in": "$$el._id"
                                }
                            }
                        ] 
                    },
                    "$$KEEP",
                    "$$PRUNE"
                ]
            }
        }
    ])
    

    上記では、 <の条件ロジックcode> $ redact セット演算子を使用して実行されます $ setIsSubset および $ map >

    $ map > 演算子は、actorsからのアクターIDのみを含む配列を返します 配列内の各要素に式を適用した後の配列。たとえば、式

    {
        "$map": {
            "input": "$actors",
            "as": "el",
            "in": "$$el._id"
        }
    }
    

    アクター配列に適用された場合

    [ 
        {
            "_id" : "artist:3",
            "first_name" : "James",
            "last_name" : "Stewart",
            "birth_date" : "1908",
            "role" : "John Ferguson"
        }, 
        {
            "_id" : "artist:16",
            "first_name" : "Kim",
            "last_name" : "Novak",
            "birth_date" : "1925",
            "role" : "Madeleine Elster"
        }, 
        {
            "_id" : "artist:282",
            "first_name" : "Arthur",
            "last_name" : "Pierre",
            "birth_date" : null,
            "role" : null
        }
    ]
    

    戻ります

    [ "artist:3", "artist:16", "artist:282" ]
    

    この結果は、単一の要素配列 ["$directors._id"]と比較されます。 $ setIsSubset 2つの配列を取り、最初の配列が2番目の配列と等しい場合を含め、最初の配列が2番目の配列のサブセットである場合はtrueを返し、それ以外の場合はfalseを返す演算子。

    たとえば、

    { 
        "$setIsSubset": [ 
            [ "artist:12" ], 
            [ "artist:3", "artist:16", "artist:282" ] 
        ] 
    }       // false
    
    { 
        $setIsSubset: [ 
            [ "artist:282" ], 
            [ "artist:3", "artist:16", "artist:282" ] 
        ] 
    }       // true
    

    演算子からのブール結果は、 $ redact パイプライン。

    パフォーマンスの説明は引き続き保持されます: $ where 必要に応じてハックするのは良いことですが、可能な限り避ける必要があります。



    1. MongoDB dropIndexes()

    2. AzureVMはAzureRedisCacheに接続していませんが、ローカルはAzureRedisCacheに接続しています

    3. Mongodbに文字列として保存された日付を処理するにはどうすればよいですか?

    4. MongoDBのシェルで20を超えるアイテム(ドキュメント)を印刷するにはどうすればよいですか?