541 votes

Vérifier si un champ contient une chaîne de caractères

Je cherche un opérateur qui me permette de vérifier si la valeur d'un champ contient une certaine chaîne.

Quelque chose comme :

db.users.findOne({$contains:{"username":"son"}})

Est-ce possible ?

2voto

bello hargbola Points 229

Si vous devez effectuer la recherche pour plus d'un attribut, vous pouvez utiliser la fonction $or. Par exemple

Symbol.find(
  {
    $or: [
      { 'symbol': { '$regex': input, '$options': 'i' } },
      { 'name': { '$regex': input, '$options': 'i' } }
    ]
  }
).then((data) => {
  console.log(data)
}).catch((err) => {
  console.log(err)
})

Ici, vous basez votre recherche sur le fait que l'entrée est contenue dans l'attribut symbol ou dans l'attribut name.

1voto

F.H. Points 1

Pour le cadre d'agrégation


Recherche sur le terrain

( '$options': 'i' pour une recherche insensible à la casse)

db.users.aggregate([
    {
        $match: {
            'email': { '$regex': '@gmail.com', '$options': 'i' }
        }
    }
]);

Recherche complète de documents

(ne fonctionne que sur les champs indexés avec un indice de texte

db.articles.aggregate([
    {
        $match: { $text: { $search: 'brave new world' } }
    }
])

0voto

Tamás Polgár Points 669

Comment ignorer les balises HTML dans une correspondance RegExp :

var text = '<p>The <b>tiger</b> (<i>Panthera tigris</i>) is the largest <a href="http://stackoverflow.com/wiki/Felidae" title="Felidae">cat</a> <a href="http://stackoverflow.com/wiki/Species" title="Species">species</a>, most recognizable for its pattern of dark vertical stripes on reddish-orange fur with a lighter underside. The species is classified in the genus <i><a href="http://stackoverflow.com/wiki/Panthera" title="Panthera">Panthera</a></i> with the <a href="http://stackoverflow.com/wiki/Lion" title="Lion">lion</a>, <a href="http://stackoverflow.com/wiki/Leopard" title="Leopard">leopard</a>, <a href="http://stackoverflow.com/wiki/Jaguar" title="Jaguar">jaguar</a>, and <a href="http://stackoverflow.com/wiki/Snow_leopard" title="Snow leopard">snow leopard</a>. It is an <a href="http://stackoverflow.com/wiki/Apex_predator" title="Apex predator">apex predator</a>, primarily preying on <a href="http://stackoverflow.com/wiki/Ungulate" title="Ungulate">ungulates</a> such as <a href="http://stackoverflow.com/wiki/Deer" title="Deer">deer</a> and <a href="http://stackoverflow.com/wiki/Bovid" class="mw-redirect" title="Bovid">bovids</a>.</p>';
var searchString = 'largest cat species';

var rx = '';
searchString.split(' ').forEach(e => {
  rx += '('+e+')((?:\\s*(?:<\/?\\w[^<>]*>)?\\s*)*)';
});

rx = new RegExp(rx, 'igm');

console.log(text.match(rx));

Il est probablement très facile de transformer ce filtre en un filtre d'agrégation MongoDB.

0voto

KushalSeth Points 828

Si le regex ne fonctionne pas dans votre solution Aggregate et que vous avez des objets imbriqués. Essayez ceci pipeline de regroupement (Si votre structure d'objet est simple, il suffit de supprimer les autres conditions de la requête ci-dessous) :

db.user.aggregate({$match: 
     {$and:[
   {"UserObject.Personal.Status":"ACTV"},
   {"UserObject.Personal.Address.Home.Type":"HME"},
   {"UserObject.Personal.Address.Home.Value": /.*son.*/ }
   ]}}
   ) 

Une autre façon serait d'effectuer directement une requête comme celle-ci :

db.user.findOne({"UserObject.Personal.Address.Home.Value": /.*son.*/ });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X