J'utilise la collection suivante qui représente les tournois sports> catégories>.Faire correspondre des éléments dans des tableaux incorporés à plusieurs niveaux
{
"_id" : ObjectId("597846358bbbc4440895f2e8"),
"Name" : [
{ "k" : "en-US", "v" : "Soccer" },
{ "k" : "fr-FR", "v" : "Football" }
],
"Categories" : [
{
"Name" : [
{ "k" : "en-US", "v" : "France" },
{ "k" : "fr-FR", "v" : "France" }
],
"Tournaments" : [
{
"Name" : [
{ "k" : "en-US", "v" : "Ligue 1" },
{ "k" : "fr-FR", "v" : "Ligue 1" }
],
},
{
"Name" : [
{ "k" : "en-US", "v" : "Ligue 2" },
{ "k" : "fr-FR", "v" : "Ligue 2" }
],
}
]
},
{
"Name" : [
{ "k" : "en-US", "v" : "England" },
{ "k" : "fr-FR", "v" : "Angleterre" }
],
"Tournaments" : [
{
"Name" : [
{ "k" : "en-US", "v" : "Premier League" },
{ "k" : "fr-FR", "v" : "Premier League" }
],
},
{
"Name" : [
{ "k" : "en-US", "v" : "Championship" },
{ "k" : "fr-FR", "v" : "Championnat" }
],
}
]
},
]
}
Je veux interroger la collection en utilisant le nom de la catégorie et le nom du tournoi. J'ai utilise avec succès « $ elemMatch » avec le code suivant:
db.getCollection('Sport').find({
Categories: {
$elemMatch: {
Name: {
$elemMatch: { v: "France" }
},
Tournaments: {
$elemMatch: {
Name: {
$elemMatch: { v: "Ligue 1" }
}
}
}
}
} },
{ "Categories.$": 1, Name: 1 })
Cependant, je ne peux pas recevoir que le tournoi correspondant dans l'objet de la catégorie. En utilisant la réponse à cette question: MongoDB Projection of Nested Arrays, j'ai construit une agrégation:
db.getCollection('Sport').aggregate([{
"$match": {
"Categories": {
"$elemMatch": {
"Name": {
"$elemMatch": {
"v": "France"
}
},
"Tournaments": {
"$elemMatch": {
"Name": {
"$elemMatch": {
"v": "Ligue 1"
}
}
}
}
}
}
}
}, {
"$addFields": {
"Categories": {
"$filter": {
"input": {
"$map": {
"input": "$Categories",
"as": "category",
"in": {
"Tournaments": {
"$filter": {
"input": "$$category.Tournaments",
"as": "tournament",
"cond": {
// stuck here
}
}
}
}
}
},
"as": "category",
"cond": {
// stuck here
}
}
}
}
}
])
J'ai essayé d'utiliser une condition, mais MongoDB ne reconnaît pas (Utilisation de la variable non définie:) $$ Cons et $ $ PRUNE ($redact) quand j'utilise $ anyElementTrue puis $ map sur la propriété "Name".
Ma question: Comment puis-je vérifier que la collection de noms contient ma chaîne?
Merci beaucoup. J'utilise un tableau imbriqué parce que dans ma conception, ces documents incorporés ne seront jamais interrogés sans leur sport parent. Nous avons essayé d'éviter la conception relationnelle basée sur une collection par type. Cependant, vous avez raison, j'ai seulement essayé de mettre à jour le tableau de niveau racine (avec succès) mais il semble impossible de mettre à jour le tableau imbriqué sans remplacer l'objet entier. – Clement