आपके सटीक उदाहरण को देखते हुए, इसे निम्नलिखित तरीके से पूरा किया जा सकता है - यदि आपकी वास्तविक दुनिया का परिदृश्य थोड़ा अधिक जटिल है, तो आपको समस्याएं आ सकती हैं, हालांकि:
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"
}
}])