MongoDB - Filtrage du contenu d'un tableau interne dans un ensemble de résultats
Je suis nouveau à l'aide de MongoDB, et je ne sais pas comment résoudre le problème suivant:
J'ai une collection de documents comme ceci:
{
"URL": "www.stackoverflow.com",
"TAGS": [
{"NAME": "question", "VOTES": 3},
{"NAME": "answer", "VOTES": 5},
{"NAME": "problem", "VOTES": 2}
]
}
Tout d'abord, je voulais toutes les Url qui ont tous les tags donnés dans une liste.
J'ai résolu ce problème en quering:
db.links.find( { "Tags.Name" : { $all: ["question","answers"] } } );
Mais cette requête en retour l'ensemble du document, place de que les de document avec seulement les balises, j'ai demandé.
Le résultat que je cherche est:
{
"URL": "www.stackoverflow.com",
"TAGS": [{"NAME": "question", "VOTES": 3},
{"NAME": "answer", "VOTES": 5}]
}
et non pas:
{
"URL": "www.stackoverflow.com",
"TAGS": [{"NAME": "question", "VOTES": 3},
{"NAME": "answer", "VOTES": 5},
{"NAME": "problem", "VOTES": 2}]
}
Parce que j'ai seulement demandé pour les balises ["question","réponses"].
J'ai pensé à l'aide de MapReduce ou de l'analyse du jeu de résultats, mais je ne sais pas si c'est la bonne manière de résoudre le problème. Peut-être qu'il est un builtin fonction que de le résoudre plus efficacement.
Merci!
source d'informationauteur Martin Zugnoni
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser l'agrégation cadre de
MongoDB
.Si vous avez une doc dans votre collection ;
et que vous souhaitez filtrer certains éléments du tableau, vous pouvez utiliser l'agrégation de l'échantillon;
Il en résultera;
comme le résultat escompté.
De manière générale, tout
find()
opération sur MongoDB retourne tous les documents qui correspondent à la requête et tous les documents sont récupérés dans leur intégralité. Si vous voulez seulement une section spécifique d'un document alors que vous avez à faire ce traitement sur le côté client.C'est une différence fondamentale entre les bases de données documentaires et bases de données SQL. Généralement dans un document de la base de données d'une requête renvoie tous les documents qui correspondent tout dans une base de données SQL, vous pouvez choisir de retourner uniquement les parties de la table. Sauf si bien sûr, comme vous dites que vous faites un MapReduce, mais ca semble exagéré pour votre cas d'utilisation.
De ne pas vous décourager d'utiliser MongoDB, mais quel que soit le projet que vous travaillez sur examiner si les bases de données NoSQL en fait adapter le projet de loi (- ils remplir une exigence que SQL ne peut pas) ou si vous souhaitez toujours être mieux d'aller avec un traditionnel de base de données SQL.
Il est possible de supprimer les clés et les éléments du tableau dans le document retourné, mais pas dans le sens que vous souhaitez.
Dans votre exemple, vous pouvez supprimer l'URL de la clé avec la requête suivante, qui utilise le deuxième argument de la méthode find():
Cependant, je ne crois pas qu'il est possible de supprimer les membres individuels d'un tableau sur le côté serveur avec find() sur la base duquel les membres du groupe ont été spécifiées avec $tous.
Vous pouvez utiliser $tranche à retourner uniquement à certains membres d'un tableau, mais il est basé sur les positions. Par exemple,
saute le premier élément du tableau et retourne jusqu'à la prochaine deux.
Merci Robert. J'ai réalisé que la vedette, je suis à la recherche n'est pas mis en œuvre à ce moment. Voici le lien de la question. J'espère que la MongoDB cominuty la met en œuvre dans un court laps de temps. Merci!
Ce qui pourrait vous aider.
https://docs.mongodb.com/manual/reference/operator/projection/elemMatch/