Vous devez créer un index de texte sur les champs que vous souhaitez rechercher :
db.deals.ensureIndex({ name: "text", description : "text", category : "text" });
De la documentation de l'opérateur $text :
$text effectue une recherche textuelle sur le contenu des champs indexés avec un index texte.
L'index que vous avez créé pour vos trois champs est un index composé et non un index de texte. L'index de texte ressemblera à ceci :
{
"v" : 1,
"key" : {
"_fts" : "text",
"_ftsx" : 1
},
"name" : "name_text_description_text_category_text",
"ns" : "test.deals",
"weights" : {
"category" : 1,
"description" : 1,
"name" : 1
},
"default_language" : "english",
"language_override" : "language",
"textIndexVersion" : 2
}