1
votes

Comment trouver un sous-champ dans Mongo sans connaître le champ parent?

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.


0 commentaires

3 Réponses :


0
votes

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


0 commentaires

0
votes

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.


0 commentaires

1
votes

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

0 commentaires