Compte tenu de la collection suivante:
db.test.insertMany([ {"_id": 1, "Jimmy": {"Loved by mom": true}}, {"_id": 2, "Andrew": {"Loved by mom": false}}, {"_id": 3, "Nicholas": {"Loved by mom": true}}", {"_id": 4, "Sarah": {"Loved by dad": true}} ]);
Existe-t-il un moyen de rechercher tous les documents qui ont le sous-champ "Aimé par maman"
, sans savoir ce que le parent le champ est appelé? Pour (espérons-le) simplifier cette tâche, le sous-champ souhaité est toujours situé en profondeur 1.
3 Réponses :
string $ search
de $ text
, Cette requête renvoie les documents qui contiennent le terme Aimé par maman
dans le champ de sujet indexé, ou plus précisément, la version dérivée du mot:
db.test.find( { $text: { $search: "Loved by mom" } } )
Je ne connais pas un moyen facile de faire ce que vous voulez.
Dans votre cas, je changerais la façon dont vos documents sont insérés dans MongoDB:
db.test.find({"lovedBy.mom" : {$exists: true}});
Ensuite, vous pouvez faire la requête comme ceci:
db.test.insertMany ([ Â Â Â Â {"_id": 1, "name": "Jimmy", "lovedBy": {"mom": true}}, Â Â Â Â {"_id": 2, "name": "Andrew", "lovedBy": {"mom": false}}, Â Â Â Â {"_id": 3, "name": "Nicholas", "lovedBy": {"mom": true}}, Â Â Â Â {"_id": 4, "name": "Sarah", "lovedBy": {"dad": true}} ]);
Il est important de toujours avoir une structure de document qui vous permet d'interroger des informations d'une manière plus simple.
Bien que MongoDB vous permette d'avoir une structure flexible, je ne recommanderais pas d'utiliser des documents qui ont des champs uniques pour chaque document.
Il ne serait pas logique que chaque document ait un champ unique et que vous souhaitiez effectuer une recherche pour les champs enfants de ces champs uniques.
De cette façon, vous ne feriez que gêner votre travail.
Existe-t-il un moyen de rechercher tous les documents qui ont le sous-champ "Aimé par maman", sans savoir comment s'appelle le champ parent?
Cette requête d'agrégation peut faire cela:
var loved_by_mom = "Loved by mom"; db.loved.aggregate( [ { $addFields: { fieldNameValues: { $objectToArray: "$$ROOT" } } }, { $unwind: "$fieldNameValues" }, { $addFields: { fldType: { $type: "$fieldNameValues.v" } } }, { $match: { fldType: "object" } }, { $addFields: { objs: { $objectToArray: "$fieldNameValues.v" } } }, { $unwind: "$objs" }, { $match: { "objs.k": loved_by_mom } }, { $project: { fieldNameValues: 0, fldType: 0, objs: 0 } } ] )