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

正規表現クエリを使用して配列フィールドでMongodbを区別しますか?

    集約フレームワーク .distinct()ではありません コマンド:

    db.event.aggregate([
        // De-normalize the array content to separate documents
        { "$unwind": "$tags" },
    
        // Filter the de-normalized content to remove non-matches
        { "$match": { "tags": /foo/ } },
    
        // Group the "like" terms as the "key"
        { "$group": {
            "_id": "$tags"
        }}
    ])
    

    正規表現の先頭に「アンカー」を使用する方がおそらく良いでしょう。つまり、文字列の「先頭」からです。また、これを行う $match $unwindを処理する前に 同様に:

    db.event.aggregate([
        // Match the possible documents. Always the best approach
        { "$match": { "tags": /^foo/ } },
    
        // De-normalize the array content to separate documents
        { "$unwind": "$tags" },
    
        // Now "filter" the content to actual matches
        { "$match": { "tags": /^foo/ } },
    
        // Group the "like" terms as the "key"
        { "$group": {
            "_id": "$tags"
        }}
    ])
    

    これにより、 $unwindを処理していないことが確認されます。 コレクション内のすべてのドキュメントと、「フィルタリング」して確認する前に「一致したタグ」の値が含まれている可能性のあるドキュメントのみ。

    一致する可能性のある大きなアレイをいくらか軽減するための本当に「複雑な」方法は、もう少し作業が必要であり、MongoDB 2.6以降:

    db.event.aggregate([
        { "$match": { "tags": /^foo/ } },
        { "$project": {
            "tags": { "$setDifference": [
                { "$map": {
                    "input": "$tags",
                    "as": "el",
                    "in": { "$cond": [
                        { "$eq": [ 
                            { "$substr": [ "$$el", 0, 3 ] },
                            "foo"
                        ]},
                        "$$el",
                        false
                    ]}
                }},
                [false]
            ]}
        }},
        { "$unwind": "$tags" },
        { "$group": { "_id": "$tags" }}
    ])
    

    したがって、 $map はアレイの優れた「インライン」プロセッサですが、これまでのところしか実行できません。 $setDifference 演算子はfalseを否定します 一致しますが、最終的には$unwindを処理する必要があります 残りの$groupを実行します 全体として明確な価値観のステージ。

    ここでの利点は、配列が一致する「タグ」要素のみに「縮小」されることです。同じドキュメントに「複数の異なる」値がある場合に発生の「カウント」が必要な場合は、これを使用しないでください。しかし、繰り返しになりますが、それを処理する方法は他にもあります。




    1. Redis:リストまたはソートされたセットのニュースフィードをファンアウトしますか?

    2. 2つのデータベースを使用する場合のJaversENTITY_INSTANCE_WITH_NULL_ID

    3. GETリクエストは常にデフォルトで/(?:)/ iになります-どうすれば「未定義」にすることができますか? -このトピックに関する2番目の質問

    4. redisでキーを複製します