MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Zagregowane zapytanie o dopasowanie Mongodb z priorytetem pełnego dopasowania

Biorąc pod uwagę Twój dokładny przykład, można to osiągnąć w następujący sposób – jeśli Twój scenariusz w świecie rzeczywistym jest nieco bardziej złożony, możesz napotkać problemy:

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"
    }
}])

Innym sposobem byłoby użycie $facet co może okazać się nieco potężniejsze, umożliwiając bardziej złożone scenariusze, ale wolniej (choć kilka osób znienawidzi mnie za tę propozycję):

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongorestore nieprzechwycony wyjątek:błąd składni

  2. MONGODB [DEBUG] cursor.refresh() dla kursora 7078636577051629992

  3. Jak sortować, wybierać i wyszukiwać poddokumenty w manguście

  4. MongoDB:Wstawianie zbiorcze (Bulk.insert) a wstawianie wielu (insert([...]))

  5. BsonValue i niestandardowe klasy w MongoDB C# Driver