Seperti yang saya jawab di In MongoDB, cari dalam array dan urutkan berdasarkan jumlah kecocokan
Itu mungkin menggunakan Kerangka Agregasi.
Asumsi
tags
atribut adalah himpunan (tidak ada elemen berulang)
Kueri
Pendekatan ini memaksa Anda untuk melepaskan hasil dan mengevaluasi kembali predikat kecocokan dengan hasil yang tidak ditentukan, sehingga benar-benar tidak efisien.
db.test_col.aggregate(
{$match: {tags: {$in: ["shirt","cotton","black"]}}},
{$unwind: "$tags"},
{$match: {tags: {$in: ["shirt","cotton","black"]}}},
{$group: {
_id:{"_id":1},
matches:{$sum:1}
}},
{$sort:{matches:-1}}
);
Hasil yang Diharapkan
{
"result" : [
{
"_id" : {
"_id" : ObjectId("5051f1786a64bd2c54918b26")
},
"matches" : 3
},
{
"_id" : {
"_id" : ObjectId("5051f1726a64bd2c54918b24")
},
"matches" : 2
},
{
"_id" : {
"_id" : ObjectId("5051f1756a64bd2c54918b25")
},
"matches" : 1
}
],
"ok" : 1
}