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

完全一致を優先するMongodb集約一致クエリ

    正確な例を考えると、これは次の方法で実現できます。実際のシナリオがもう少し複雑な場合は、問題が発生する可能性があります。

    db.accounts.aggregate([{
        $match: {
            "username": /pat/i // find all documents that somehow match "pat" in a case-insensitive fashion
        }
    }, {
        $addFields: {
            "exact": { 
                $eq: [ "$username", "pat" ] // add a field that indicates if a document matches exactly
            },
            "startswith": { 
                $eq: [ { $substr: [ "$username", 0, 3 ] }, "pat" ] // add a field that indicates if a document matches at the start
            }
    
        }
    }, {
        $sort: {
            "exact": -1, // sort by our primary temporary field
            "startswith": -1 // sort by our seconday temporary
        }
    }, {
        $project: {
            "exact": 0, // get rid of the "exact" field,
            "startswith": 0 // same for "startswith"
        }
    }])
    

    別の方法は、$facetを使用することです。 これは、より複雑なシナリオを有効にすることで少し強力になる可能性がありますが、遅くなります(ただし、この提案では、ここにいる何人かの人々が私を嫌います):

    db.accounts.aggregate([{
        $facet: { // run two pipelines against all documents
            "exact": [{ // this one will capture all exact matches
                $match: {
                    "username": "pat"
                }
            }],
            "others": [{ // this one will capture all others
                $match: {
                    "username": { $ne: "pat", $regex: /pat/i }
                }
            }]
        }
    }, {
        $project: {
            "result": { // merge the two arrays
                $concatArrays: [ "$exact", "$others" ]
            }
        }
    }, {
        $unwind: "$result" // flatten the resulting array into separate documents
    }, {
        $replaceRoot: { // restore the original document structure
            "newRoot": "$result"
        }
    }])
    



    1. Mongoのデータをカスタムオーダーで並べ替える方法

    2. マングースサブドキュメントの並べ替え

    3. mongodbとnodejsを使用してpromiseを解決する

    4. スプリングデータを使用してnot演算子を組み合わせる方法Criteriabuilder